用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,那这些海量的评论里是否有自己关心的人写的呢?想通过评论看看某朋友最近的动态或者心情。但是这么多的数据如何找出指定人的评论?一页一页翻,用最原始的手动方法是行不通的,下面笔者用python爬虫实现这个需求,代码我会分享出去,有任何问题或者帮助都可以找我沟通。
如果不是开发人员,有需要可以找我查wx:fas1024
由于网易云音乐的评论都做了混淆加密处理,因此我们需要深入了解它的加密过程之后才能爬取到网易云音乐评论。
一,首先分析数据的请求方式
由于网易云音乐的评论是通过Ajax传输,我们打开浏览器的开发者工具(检查元素),选中控制面板中的Network,再点击XHR(捕获ajax数据),然后点击左上角的重新加载,会看到下面图片中的数据请求列表
发现我们所需要的数据就在这json格式的数据中,其中comments中是第一页的全部评论,一共20条,hotcomments是精彩评论一共有15条,每首歌曲只有第一页评论才有精彩评论.接着看一下它的请求头,点击Headers
我们发现的它是个post请求,向下滑你会发现这个post请求还带有数据
二,分析加密过程
通过断点调试发现params和encSecKey是由js脚本中的window.asrsea()函数生成的.
我们发现window.asrsea()函数有4个参数,在浏览器的js控制台分别对这四个参数进行调试:
三,生成加密参数
首先我们需要生成长度为16的随机字符串,这里我们仿照上面的javascript的实现,用Python生成16位长的随机字符串,接着用Python实现AES加密,这里要用到pycrypto库,先安装好这个库,然后导入加密模块,然后是RSA加密.首先我简单介绍一下RSA的加密过程.在RSA中,明文,密钥和密文都是数字.RSA的加密过程可以用下列的公式来表达,这个公式非常的重要,你只有理解了这个公式,才能用Python实现RSA加密.RSA的密文是对代表明文的数字的E次方求mod N 的结果, 通俗的讲就是将明文和自己做E次乘法,然后将其结果除以N 求余数,这个余数就是密文.RSA加密后得到的字符串长为256,如果不够长则进行填充(不足部分在左侧添0).最后就是获取那两个加密参数。
四,获取全部评论
上面我们获取到了两个参数encText和encSecKey,利用这两个参数来构造post表单数据(Form Data),即data的值:
params, encSecKey = get_params(page)
data = {'params': params, 'encSecKey': encSecKey}
歌曲评论的URL为:
url = 'https://music.163.com/weapi/v...' + str(songid) + '?csrf_token='
然后把data加到post的参数中去就能获取到json格式的评论数据.
html = requests.post(url, headers=headers, data=data)
代码输出,如下图:有完整15条数据,截图范围有限,显示6条。开发人员可以自己玩玩,有需要帮助可以找我,微:fas1024
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。