爬取目标:
首页 8d93120efc7aac31648363dabd3ff4e9 接口:805E4C9121CC89786CEE70F095EACBDF
使用工具及涉及知识点
语言:Python===3.6 模块:requests random time hashlib-->md5 浏览器:chrome96
事件起因
看到某群组里面讨论目标很难爬取,各种参数加密。于是抱着好奇心搞起… 网站本身有开发者平台提供api,但是有使用次数限制。
开启反爬之路
-
使用Chrome抓包工具找到接口入口网址,发现需要携带一堆参数提交POST请求 -
直接使用现有的参数向目标接口发送请求(未携带header参数),得到{errorcod:50},请求失败,说明网站在请求头参数进行了反爬限制。 -
挨个尝试请求头参数:发现需要携带3个请求头参数User-Agent Cookies Referer,携带post表单发起请求,得到了正确的响应结果,BUT,更换查询词后,又收到了{errorcod:50}的错误。说明参数具有时效性或者绑定了查询词。开始debug js代码 -
根据堆栈根据找到js源码,查找加密参数位置,进行断点调试
发现目标参数有15个,找到能看懂的一个位置进行解析(包含了sign和bv两个加密参数)。
var r = function(e) {
var t = n.md5(navigator.appVersion)
, r = "" + (new Date).getTime()
, i = r + parseInt(10 * Math.random(), 10);
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT")
}
通过阅读代码可以看出参数bv是一个固定值,当前客户端浏览器版本的md5加密值,bv=t=n.md5(navigator.appVersion)。 ts:时间戳 salt=i=ts+一位随机数 sign:从程序分析得不到结果,因为不知道参数e是什么。 打断点分析,很愉快,并不是什么加密,而是输入的查询字符串。
所有参数拿到,剩下的就是用python实现一些加密算法了
python模拟加密算法
- 时间戳:python的时间戳和js的时间戳表现方式是有些不同的,这个需要注意
lts = str(time.time()*1000).split('.')[0] # 当前时间戳 - md5加密:在python中导入hashlib中的md5就可以直接模拟加密了
sign_str = 'fanyideskweb' + trans_word + salt + 'Y2FYu%TNSbMCxc3t2u^XT'
md = md5()
md.update(sign_str.encode())
sign = md.hexdigest()
发送正式请求
trans_word = str(input('please type a word.\n'))
data = get_data(trans_word)
res = requests.post(url=url, data=data, headers=headers)
result = res.json()
print('*'*20)
print('查询结果是:\n')
print(result['translateResult'][0][0]['tgt'])
print('\n','*'*20)
很开心,得到了正确的请求响应结果
反爬工作到此结束,但是真正的工作才刚刚开始 我们的需求不可能是一个词,应该有很多,或者是一篇论文。所以含有很多问题需要处理。
TODO
-
IP 请求次数限制。可维护一个代理池进行请求。 -
查询词字数限制问题。可对文本进行有效分割 -
程序应该具有识别文本格式并提取出查询词的能力。TXT WOERD PDF…
over! 首发掘金社区 链接:https://juejin.cn/post/7037431549821714446
|