python爬虫网易云音乐评论最多的歌_Python网易云音乐评论爬虫,歌曲的全部评论...

用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条.现在我就来分享一下如何爬取网易云音乐歌曲的全部评论,由于网易云音乐的评论都做了混淆加密处理,因此我们需要深入了解它的加密过程之后才能爬取到网易云音乐歌曲的全部评论.

一,首先分析数据的请求方式

网易云音乐歌曲页面的URL形式为https://music.163.com/#/song?id=歌曲id号,这里我用Delacey的Dream it possible 为例进行讲解,它的URL为https://music.163.com/#/song?id=38592976.接下来开始分析数据的请求方式.

由于网易云音乐的评论是通过Ajax传输,我们打开浏览器的开发者工具(检查元素),选中控制面板中的Network,再点击XHR(捕获ajax数据),然后点击左上角的重新加载,会看到下面图片中的数据请求列表

b17eca8065380cd7fbee229471c3d73058828167.png?token=1faed9f91c641f34e1f3ccedf5911881&s=61F2A3645BA0B36C1CE1540F0000E0C1

点击R_SO_4_38592976?csrf_token=cdee144903c5a32e6752f50180329fc9这一行,再点击Preview

f703738da9773912ddd7e27a369efc1c377ae240.png?token=0bf5e7dd99dbf8bd14ad605f9b679df1&s=79E213664BE497604EF9FD070000E0C1

发现我们所需要的数据就在这json格式的数据中,其中comments中是第一页的全部评论,一共20条,hotcomments是精彩评论一共有15条,每首歌曲只有第一页评论才有精彩评论.接着看一下它的请求头,点击Headers

6a600c338744ebf8e2795ad2177ead2e6159a75b.png?token=a46e1cdc53041ef3b33c6aa8a065496a

我们发现的它是个post请求,向下滑你会发现这个post请求还带有数据

e824b899a9014c08b787e184c5fc780c7af4f4e4.png?token=3cbc8104357bb88201159e45cf5396b8

这些数据都是经过加密处理的,因此我们需要分析它的加密过程来生成相应的参数,然后把加密后的参数加到post请求中才能获取到我们需要的评论数据.

二,分析加密过程

通过断点调试发现params和encSecKey是由js脚本中的window.asrsea()函数生成的.

eac4b74543a982263effdbf44505c3054b90ebb0.png?token=da7c1376959f4e2117a791d25e9e1534

我们发现window.asrsea()函数有4个参数,在浏览器的js控制台分别对这四个参数进行调试:

6c224f4a20a446234393382b57a5080a0df3d7ae.png?token=69b59c5c3ba7dcb025950770456963b1

后面三个参数是定值,只有第一个参数是控制评论页面偏移量的参数,它是一个变量.笔者经过分析发现第一个参数的形式是:

bba1cd11728b4710d6adc6e71349b9f9fd0323a2.png?token=57ebfd113ea79c0c22145461379414cd

下面我来详细讲解这个变量的发现过程:

首先找到core_dfe56728795d119e4d476fd09ea2dc51.js这个js脚本,然后将断点打在第12973行,点击第一页评论,页面加载到断点处便停止了

562c11dfa9ec8a1399a084c12784eb8ba1ecc0e2.png?token=e3e5ce1c720730ed48b02aef2790e805

然后按下电脑的Esc键打开js控制台,输入i1x,查看第一个变量:

b7fd5266d0160924f246aae81a804ffee7cd3469.png?token=838b9316bd1637a82d5144dcdd9cbd8b

这是第一页的i1x的值,接下来看第二页的(需要点击第2页,然后输入i1x的值):

faf2b2119313b07e7d6502f6c250eb2795dd8c84.png?token=aa824159ff06ba1b02a3b5840a8a0b11

再看第3页:

7e3e6709c93d70cf97fd5542375bab04bba12b82.png?token=9e98f087a27f5e6161077ee568d18d23

再看第4页:

11385343fbf2b211867eb65c05071f3c0dd78edf.png?token=4ef995134f8ddf06599651db40d52471

通过这几页的分析,我们可以得到i1x值的变化规律,且可以得到它的一般形式:

9213b07eca80653881670066475adb40ac348246.png?token=5a7ffe1fa88cf6cc603bb91f1571e311

offset和limit是必选参数,其他参数是可选的,其他参数不影响data数据的生成,offset (页面偏移量) = (页数-1) * 20, 注意limit最大值为100,当设为100时,获取第二页时,默认前一页是20个评论,也就是说第二页最新评论有80个,有20个是第一页显示的.因此我们可以构造第一个参数为:

a71ea8d3fd1f4134c6b32934f598efced0c85e7b.png?token=49328ec4289a13d55c89097afbe80dae&s=1EAA74234D6F552018DCA1DA0300C0B1

接下来,我们来看一下window.asrsea()函数的整个加密过程:

d1160924ab18972b07c3f44f344a018d9c510ac2.png?token=02a01147251af2bc112752f1da691d98&s=5EAA3463090FC14D1EDDA1DA0300C0B1

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

b3fb43166d224f4a094f802fd970ea569922d140.png?token=c5d0a4c4d1047cd6faef653a316fab9d&s=5AAA346349DA6DC81C7584D20300C0B1

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

三,生成加密参数

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

a9d3fd1f4134970ad7dba195454dabcca6865d68.png?token=f47b42e6a0f6710baa8cca242aa1e7c8&s=1AA874231D0A4445587DA4DA030080B1

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

279759ee3d6d55fbf7dde5ebbda5354e21a4dd74.png?token=3b2ce54cd1d99cf94695333ee68ae01b&s=7A283462A53058230AD05DD30300A0B1

然后导入加密模块:

ac4bd11373f082020d7bebc2847c81e9a9641be9.png?token=a47288f67646b99fe7ea766169efcc3c&s=5AA83462C534682358D9D9D30300A0B1

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

96dda144ad3459824871f92bdd734ba9caef8418.png?token=62ec963507f5f9254a8cd20676d56380&s=1EAA7023C56859014CDDE0DB030080B0

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

caef76094b36acaf0e37a87fad5ef71403e99ced.png?token=d08741664e1f0fdf75d0788f2c384af5&s=1EAA702313EFC0EC5E7D00DA0300C0B0

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

c2fdfc039245d6888a1aa11c7445071ad31b24fd.png?token=b6ba1932a6cd398398240b515215126f&s=7AAC3462C575C9220AF5E9D30300E0B1

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

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

c75c10385343fbf22d0eeae761f9b08464388f64.png?token=3314f334c83161e45b3a28e8fbaac4fd&s=1AA870239F684C0308F5A0DA0300C0B1

RSA加密后得到的字符串长为256,这里不够长我们用x字符填充.

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

5366d0160924ab18e725f515e17d9cc97b890b68.png?token=bfb1b68c35e350fa53f5660ad925521a&s=5AAA34630F624D201C7580DA030080B1

四,获取全部评论

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

d1160924ab18972bf1335a79344a018d9f510a87.png?token=8bf161057291bd073482295cb46d2612&s=3EAA7C23C5346C211E7D90C20300C0B1

歌曲评论的URL为:

fc1f4134970a304e0527d924014fdd82c8175c76.png?token=aba2320b080a05332b9c2d7aba95cd05

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

d4628535e5dde7110ab6d39c7768b41f9c166184.png?token=5a3a86e70746367fc56e3793914cad7b

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值