JS逆向爬虫实战:破解加密Token获取电影数据
一、问题背景
在爬取某电影网站(spa6.scrape.center
)时,发现其API接口/api/movie/
的请求参数token
经过加密处理。直接使用Python的requests
库请求拿不到数据,需逆向分析token
生成逻辑并复现加密过程。
二、逆向分析过程
1. 定位加密入口
通过浏览器开发者工具的Search
功能,搜索关键字token
,定位到以下关键代码段:
_0x263439 = Object(_0x2fa7bd['a']) (this['$store']['state']['url']['index']);
调试发现_0x263439
即为加密后的token
,其值由_0x2fa7bd['a']
函数生成。
2. 分析加密函数逻辑
进一步追踪发现,加密函数的核心逻辑如下:
- 明文组成:将API路径
/api/movie
与当前时间戳拼接,格式为/api/movie,<timestamp>
- 加密方式:对拼接后的字符串进行SHA1哈希计算,生成十六进制摘要
- 最终Token:将哈希值与时间戳拼接并转化为
bs64
格式
3. 验证加密逻辑
通过调试确认,加密结果形如:
MmRlOWM0MWI3NzhiZDhlY2MwODVjYmVmMTEzODE2ZTgxZTNiOTBjOSwxNzQ2NjE2MjM5
三、加密算法复现
1. JavaScript实现(原逻辑)
// sha1.js
const crypto = require('crypto');
function encrypt() {
const _time = Math.floor(Date.now() / 1000);
const path = "/api/movie";
const plainText = path + "," + _time;
const hash = crypto.createHash('sha1').update(plainText).digest('hex');
return hash + "," + _time;
}
2. Python复现(通过execjs调用)
# sha1加密.py
import execjs
import base64
with open('sha1.js', 'r', encoding='utf-8') as f:
js_code = f.read()
js = execjs.compile(js_code)
token = js.call('encrypt')
data_bs64 = base64.b64encode(token.encode()).decode()
四、完整爬虫实现
1. 请求参数构造
- Token生成:调用上述JS代码生成加密字符串,并进行Base64编码
- 分页逻辑:通过
offset
参数控制翻页,每页10条数据
2. 核心代码
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
"Referer": "https://spa6.scrape.center/"
}
url = "https://spa6.scrape.center/api/movie/"
for page in range(10):
params = {
"limit": 10,
"offset": page * 10,
"token": data_bs64 # 替换为实际生成的Token
}
resp = requests.get(url, headers=headers, params=params).json()
for item in resp['results']:
print(item['name'], item['score'])
3. 关键点说明
- 时间同步:需保证服务器与本地时间误差不超过1秒
- Base64编码:原始SHA1字符串需进行编码后传递
- 反爬策略:需携带Headers,特别是
ua
系列参数
五、结果验证
成功获取分页数据,输出示例:
肖申克的救赎 9.7
霸王别姬 9.6
阿甘正传 9.5
...
第10页数据爬取完毕
六、总结
- JS逆向核心:通过断点调试定位加密函数,分析输入输出关系
- 跨语言实现:使用
execjs
桥接JavaScript加密逻辑 - 工程化扩展:可改用纯Python实现SHA1避免依赖Node.js
完整代码已上传Gitee:【项目连接】
逆向启示录:面对前端加密时,重点追踪网络请求前的参数生成过程,善用浏览器调试工具的Search
和Breakpoint
功能可事半功倍。