说明
项目完整代码:https://pan.bigdataboy.cn/#/s/ZjSy
爬虫难点
可以发现所需要提交的参数是被
加密的
(虽然这段加密结果每次都不一样,可以重复使用,但这不是我们的目的,我们并不仅限于一个歌单)
开始分析
定位Js加密函数位置
搜索,分析加密参数所在的Js文件
定位加密函数所在位置
分析加密参数
定位到了加密参数所在的位置,就需要分析
传入的参数
通过多次抓包,发现这三个参数都是定值
bqN1x(["流泪", "强"])
->010001
bqN1x(["爱心", "女孩", "惊恐", "大笑"])
->0CoJUm6Qyw8W8jud
bqN1x(Wx4B.md)
->00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
继续查看传入的第一个参数,找到
真正的参数列表
{ csrf_token: "", cursor: "-1", offset: "0", orderType: "1", pageNo: pageNo, pageSize: pageSize, rid: "A_PL_0_" + rid, threadId: "A_PL_0_" + rid, }
分析加密函数
进入加密函数内部查看
分析发现:
需要的参数列表
被加密进了变量params
,所以有个取巧(不用管变量encSecKey
,把他当做一个常量
)
实现加密过程
到了这里差不多就了解了大概的加密过程,所以我就需要选着实现加密过程的方式,这里有两种方式可供查考
- 使用 Python 重写加密过程(加密简单还能实现,费时费力)
- 使用 Python 执行 Js 代码,得到加密结果(比较推荐)
这里使用
execjs
(注意安装的时候是pyexecjs
) ,它会自动调动本机的Js环境执行代码(本机已安装node.js
。如果Js加密代码里使用了 windows对象,document对象获取参数 … 就需要选择其他能够调用浏览器驱动的类库)
构建加密Js文件
先把主要调用的Js代码复制出来
使用
execjs
执行这段Js代码
import execjs # 读取Js文件 js = open('music.163.js','r',encoding="utf-8").read() # 预编译Js文件 ext = execjs.compile(js) # 执行Js函数 result= ext.call('start') print(result)
说明所复制的Js代码不够完整,所以就需要继续去找,然后添加到 Js文件里。
执行加密Js代码
import requests import execjs url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token=' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', } # 读取Js文件 js = open('music.163.js','r',encoding="utf-8").read() # 预编译Js文件 & 执行Js函数 result = execjs.compile(js).call('start','3130270730') data = { 'params': result['encText'],'encSecKey': result['encSecKey']} # 发送请求 r = requests.post(url=url,headers=headers,data=data) print(r.json()) print(r)
彩蛋:网易音乐的大部分接口都是这个加密方式,只是提交的参数列表不一样
版权声明:《 【爬虫项目】网易云歌单评论 》为明妃原创文章,转载请注明出处!
最后编辑:2020-8-9 14:08:11