七麦网站爬虫 (解决自动化登陆请求、破解请求签名算法、识别登陆验证码)
七麦是一个提供AppStore
和全国各大安卓市场的数据的网站,感兴趣的朋友可以官网走一波
1 . 反爬手段
2 . 反“反爬”手段
- 2.1 反前端调试Debug
- 2.2 自动登录流程分析
- 2.3 CNN登录验证码识别
- 2.4 JS请求签名逆向破解
3 . 参考资料
4 . 使用
首先,我们进入七麦的首页,使用Chrome
打开DevTool
,就会发现弹出Debug
的页面。
而且会跳到source
这个Tab
,
这就是典型的前端反调试,它是会根据某些条件判断你是否处于调试的状态,来不断的产生Debug
,来阻断你调试的过程,最后由于debug
对象不断堆积,导致浏览器崩溃。
首先,我们进入七麦的登录页面,我们再次打开DevTools
,把选项卡切到Network
tab,我们可以发现其实会产生3个XHR
请求,这三个请求的时间都是有差别的,而且每个请求的响应都是如图所示,
会有成功的应答,因此我们可以分析,该登录流程是有先后请求的关系,经过后面的验证,确实是有请求的先后,不能直接一步登录。
到了很烦人的验证码,我们可以仔细看一下这个验证码,它的内容其实不是很复杂,特征还是比较明显的,关于它的具体破解我们之后再进行详细的分析,我们可以看看如何得到验证码的图片。
如图所示,我们看之前登录流程中的某些请求在请求参数中会有这个字段的参数,我们具体找个URL
来看一下,
以
https://api.qimai.cn/rank/indexPlus/brand_id/1?analysis=IRIdEVEIChkIDF1USWkOFkofB0YADVNoWVQYCHZCBwdVAgFSBFFWB1ciGgA%3D
这个地址为例,我们看到的是
也就是请求签名的参数是analysis
我们根据之前的Debug
,我们顺着右侧的Call Stack
,找到产生这个代码的源文件,如图所示,就可以发现源代码如图所示,
这时我们可以把js
文件下载下来,修改上图的代码为
function t() {
try {
var a = "";
!function e(n) {
(1 !== ("" + n / n).length || 0 === n) && function() {}
.constructor(a)(),
e(++n)
}(0)
} catch (a) {
setTimeout(t, 500)
}
}
t=function(){}
PS: 由于在分析七麦的网站时,它莫名的取消了前端反调试这个限制,所以大家在爬的时候可以放心的调试,有对于前端反调试感兴趣的同学可以私信我一些具体案例。
大家可以参考一下的文章:
https://segmentfault.com/a/1190000012359015
https://0x0d.im/archives/javascript-anti-debug-and-obfuscator.html
之后会具体出一些跟前端有关的反爬手段的解决。
流程分析我们就是按之前的图顺序来发请求,具体可参考源码
现在我们来一步步试着破解,以analysis
为加密参数,我们下一个xhr断点,
也就是我们到该请求的js
文件当中
,在右侧的
XHR Breakpoints
中添加一个适配项,拦截一个XHR请求,我们刷新页面进入断点的
js
文件,我们看到如图所示,接着我们顺着
Call Stack
寻找什么时候analysis
参数被添加,我们发现这里还没有被添加,接着找,我们发现在这里的时候还没添加参数,
下一步就有了参数,于是我们在这一步的
js
代码中寻找,我们发现了interceptors
,也就是请求拦截器,我们打个断点,
进入
interceptors
流中查看一下,即可发现主加密代码,如何寻找加密代码就是以上的流程,接下来,我们来分析一下具体的加密算法,我们可以发现,
主要的使用的函数是
l.h
,l.d
,我们直接在这两个函数上打断点,即可进入响应的算法,下面就是不断地下一跳了。
1.参考了冷月大神的《七麦加密破解》,做了些补充.
2.也参考了不知名的大神的另一种分析方法.
3.感谢nickliqian老哥的cnn识别,推荐一波,有待大家的优化。
具体使用:
(1)auto_login
from auto_login.login_async import qimai_login_async
session = await qimai_login_async()
即可获取一个aiohttp.ClientSession对象
(2) captcha_reconize
使用方法可参考上面的nickliqian
大神,另外加了一点自己的获取验证码图片的方法以及训练样本。