【爬虫项目】网易云歌单评论

说明

项目完整代码:https://pan.bigdataboy.cn/#/s/ZjSy

爬虫难点

mark

可以发现所需要提交的参数是被加密的(虽然这段加密结果每次都不一样,可以重复使用,但这不是我们的目的,我们并不仅限于一个歌单)

开始分析

定位Js加密函数位置

搜索,分析加密参数所在的Js文件

mark

定位加密函数所在位置

mark

分析加密参数

定位到了加密参数所在的位置,就需要分析传入的参数

通过多次抓包,发现这三个参数都是定值

  • bqN1x(["流泪", "强"]) -> 010001
  • bqN1x(["爱心", "女孩", "惊恐", "大笑"]) -> 0CoJUm6Qyw8W8jud
  • bqN1x(Wx4B.md) -> 00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7

mark

继续查看传入的第一个参数,找到真正的参数列表

{
    csrf_token: "",
    cursor: "-1",
    offset: "0",
    orderType: "1",
    pageNo: pageNo,         
    pageSize: pageSize,     
    rid: "A_PL_0_" + rid,
    threadId: "A_PL_0_" + rid,
}

mark

分析加密函数

进入加密函数内部查看

mark

分析发现:需要的参数列表被加密进了变量params,所以有个取巧(不用管变量encSecKey,把他当做一个常量

mark

实现加密过程

到了这里差不多就了解了大概的加密过程,所以我就需要选着实现加密过程的方式,这里有两种方式可供查考

  • 使用 Python 重写加密过程(加密简单还能实现,费时费力)
  • 使用 Python 执行 Js 代码,得到加密结果(比较推荐)

这里使用 execjs(注意安装的时候是 pyexecjs) ,它会自动调动本机的Js环境执行代码(本机已安装 node.js。如果Js加密代码里使用了 windows对象,document对象获取参数 … 就需要选择其他能够调用浏览器驱动的类库)

构建加密Js文件

先把主要调用的Js代码复制出来

mark

使用 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文件里。

mark

执行加密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)

mark

彩蛋:网易音乐的大部分接口都是这个加密方式,只是提交的参数列表不一样

发表评论 / Comment

用心评论~