网易云音乐歌曲评论爬虫(附python源码)_return h

文章详细描述了如何使用Python实现AES和RSA加密技术,用于获取网易云音乐的评论数据。涉及AES两次加密和RSA加密的过程,以及生成随机字符串和加密参数的方法。
摘要由CSDN通过智能技术生成

, d = CryptoJS.enc.Utf8.parse(“0102030405060708”)
          , e = CryptoJS.enc.Utf8.parse(a)
          , f = CryptoJS.AES.encrypt(e, c, {
            iv: d,
            mode: CryptoJS.mode.CBC
        });
        return f.toString()
    }
    // 函数c实现RSA加密
    function c(a, b, c) {
        var d, e;
        return setMaxDigits(131),
        d = new RSAKeyPair(b,“”,c),
        e = encryptedString(d, a)
    }
    function d(d, e, f, g) {
        var h = {}
          , i = a(16);
        return h.encText = b(d, g),
        h.encText = b(h.encText, i),
        h.encSecKey = c(i, e, f),
        h
    }
    function e(a, b, d, e) {
        var f = {};
        return f.encText = c(a + e, b, d),
        f
    }
    window.asrsea = d,
    window.ecnonasr = e
}();


`window.asrsea()`函数就是上面的d函数,现在我们来看函数d:



function d(d, e, f, g) {
        var h = {}
          , i = a(16);
        return h.encText = b(d, g),   // 第一次AES加密
        h.encText = b(h.encText, i),    // 第二次AES加密
        h.encSecKey = c(i, e, f),    // RSA加密
        h
    }


参数`h.encText`是经过两次AES加密得到的,h.encSecKey是经过一次RSA加密得到的,其中i是随机生成的长度为16的随机字符串.


**三、生成加密参数**


首先我们需要生成长度为16的随机字符串,这里我们仿照上面的javascript的实现,用Python生成16位长的随机字符串:



# 生成随机字符串
def generate_random_strs(length):
    string = “abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”
    # 控制次数参数i
    i = 0
    # 初始化随机字符串
    random_strs  = “”
    while i < length:
        e = random.random() * len(string)
        # 向下取整
        e = math.floor(e)
        random_strs = random_strs + list(string)[e]
        i = i + 1
    return random_strs


接着用Python实现AES加密,这里要用到pycrypto库,先安装好这个库:



pip   install   pycrypto


然后导入加密模块:



from Crypto.Cipher import AES


由于AES加密的明文长度必须是16的倍数,因此我们需要对明文进行必要的填充,以满足它的长度是16的倍数:



# msg是需要加密的明文,如果不是16的倍数则进行填充(paddiing)
padding = 16 - len(msg) % 16
# 这里使用padding对应的单字符进行填充
msg = msg + padding * chr(padding)


AES加密的模式是AES.MODE\_CBC,初始化向量`iv=’0102030405060708′`,具体的AES加密:



# AES加密
def AESencrypt(msg, key):
    # 如果不是16的倍数则进行填充(paddiing)
    padding = 16 - len(msg) % 16
    # 这里使用padding对应的单字符进行填充
    msg = msg + padding * chr(padding)
    # 用来加密或者解密的初始向量(必须是16位)
    iv = ‘0102030405060708’

cipher = AES.new(key, AES.MODE_CBC, iv)
    # 加密后得到的是bytes类型的数据
    encryptedbytes = cipher.encrypt(msg)
    # 使用Base64进行编码,返回byte字符串
    encodestrs = base64.b64encode(encryptedbytes)
    # 对byte字符串按utf-8进行解码
    enctext = encodestrs.decode(‘utf-8’)

return enctext


然后是RSA加密.首先我简单介绍一下RSA的加密过程.在RSA中,明文,密钥和密文都是数字.RSA的加密过程可以用下列的公式来表达,这个公式非常的重要,你只有理解了这个公式,才能用Python实现RSA加密.



密文    =    明文E mod  N           (RSA加密)


RSA的密文是对代表明文的数字的E次方求mod N 的结果, 通俗的讲就是将明文和自己做E次乘法,然后将其结果除以N 求余数,这个余数就是密文.


下面来看具体的RSA加密代码实现:



# RSA加密
def RSAencrypt(randomstrs, key, f):
    # 随机字符串逆序排列
    string = randomstrs[::-1]
    # 将随机字符串转换成byte类型数据
    text = bytes(string, ‘utf-8’)
    seckey = int(codecs.encode(text, encoding=‘hex’), 16)**int(key, 16) % int(f, 16)
    # 返回整数的小写十六进制形式
    return format(seckey, ‘x’).zfill(256)


RSA加密后得到的字符串长为256,如果不够长则进行填充(不足部分在左侧添0).


最后就是获取那两个加密参数:



# 获取参数
def get_params(page):
    # msg也可以写成msg = {“offset”:“页面偏移量=(页数-1) * 20”, “limit”:“20”},offset和limit这两个参数必须有(js)
    # limit最大值为100,当设为100时,获取第二页时,默认前一页是20个评论,也就是说第二页最新评论有80个,有20个是第一页显示的
    # 偏移量
    offset = (page-1) * 20
    # offset和limit是必选参数,其他参数是可选的,其他参数不影响data数据的生成,最好还是保留
    msg = ‘{“offset”:’ + str(offset) + ‘,“total”:“True”,“limit”:“20”,“csrf_token”:“”}’
    key = ‘0CoJUm6Qyw8W8jud’
    f = ‘00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7’
    e = ‘010001’
    enctext = AESencrypt(msg, key)
    # 生成长度为16的随机字符串
    i = generate_random_strs(16)

# 两次AES加密之后得到params的值
    encText = AESencrypt(enctext, i)
    # RSA加密之后得到encSecKey的值
    encSecKey = RSAencrypt(i, e, f)
    return encText, encSecKey


**四、获取全部评论**


上面我们获取到了两个参数encText和encSecKey,利用这两个参数来构造post表单数据(Form Data),即data的值:



params, encSecKey = get_params(page)
data = {‘params’: params, ‘encSecKey’: encSecKey}


歌曲评论的URL为:



url = ‘https://music.163.com/weapi/v1/resource/comments/R_SO_4_’ + str(songid) + ‘?csrf_token=’


然后把data加到post的参数中去就能获取到json格式的评论数据.



html = requests.post(url, headers=headers, data=data)


至此,获取网易云音乐全部评论的Python爬虫实现原理分析全部完成!




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值