emo云爬取评论(day1)
学习爬虫的第一天,目标:获得网易云音乐的评论信息。
定位
查看网页和框架的源代码,发现源代码中并没有评论信息,评论信息大概率是通过js后续加载的。
浏览器在渲染了html文件后,会执行其中的js文件,这些js代码会向特定的api接口发送请求,比如下图,发送请求评论的请求。

请求头是这样的。
负载是这样的。

如果要爬取评论,需要完成下面3件事情。
- 找到未加密的参数来源。
- 对参数进行加密(符合网易的加密逻辑),充当负载部分。
- 发送请求,获得评论。
参数来源
在浏览器的开发工具中,启动器可以查看发出这个请求之前,执行了哪些js脚本。

点开了最后一个执行的js文件,下断点。

一路跳过不匹配的包,直到匹配目标url。
我发现js的调用堆栈有个好处,记录了调用时的值。
一路翻看调用堆栈,直到翻到data处于明文的时候。

发现处于下面这个匿名调用时,Ce2x的内容尚未加密,说明加密点在t6n.be6Y。

在be6Y中下了一个断点,发现:当执行完window.asrsea(JSON.stringify(i6c), bsC7v(["流泪", "强"]), bsC7v(BA1x.md), bsC7v(["爱心", "女孩", "惊恐", "大笑"]));后,数据就加密完了,这个window.asrsea就是加密点。

将明文导出来。
1 | data = { |
加密算法
差一个加密流程,就可以构造报文发包了。
加密函数是window.asrsea,搜索一下。
对下面的内容进行分析,获得加密方式。
函数a:获得长度为a的字符串。
函数b:AES对称加密,数据是a、密钥是b。
函数c:利用服务器的公钥b和c对数据a进行RSA加密,b是公钥、c是模数。
函数d:负责调用函数a/b/c,得到结果。
1 | function a(a) { |
这个加密流程调用了函数d,函数d的4个参数有3个是固定值。

将上述流程转换成python代码。
1 | import base64 |
爬取评论
跑脚本。

发现不需要”csrf_token”也可以获得返回值。
之后修改了一下代码,爬取结果变好看了。
