实例解析|Python加解密VIP网站反爬请求头实现数据爬取!
正常情况下,对于需要登录的网站,一般只要将登录后的cookie携带到headers中就可以实现认证后的访问请求。但是,也有例外。
最近,州的先生(zmister.com)遇到了一个网站,就是那样的例外。
文章目录
请求受阻
通过页面调试,找到了其数据接口,如下图所示:
![](https://img.haomeiwen.com/i16749901/6d7fd19d73514b85.png!web)
![](https://img.haomeiwen.com/i16749901/3deaa26c3d0e5adb.gif)
数据在接口的响应中一览无遗,于是按照常例,我们马上构造一个与网页请求一样的headers:
[图片上传失败...(image-7f4350-1553841035135)]
![](https://img.haomeiwen.com/i16749901/70981fdcee9b0914.gif)
然后使用requests对接口url进行请求:
<pre>response = requests.get(url, headers=headers, timeout=5)
print(response.text)
</pre>
本以为会顺顺利利地看到接口数据被打印出来,没想到返回的却是一个401的响应,内容为:
<pre>Illegal access
</pre>
![](https://img.haomeiwen.com/i16749901/8c6be4573662f8b9.gif)
![](https://img.haomeiwen.com/i16749901/dbaa1e656949d2df.gif)
显然,它提示我们未授权访问。但是我们明明已经将登陆后的Cookie放到了headers中。如果cookie没问题,那么就要分析其他的地方了。
分析JS
排查一番,发现请求参数是没问题的,header里面的compassS是一个会变化的值,问题应该就出在这里。
为了验证这个猜想,我们在调试控制台中搜索包含compassS的文件资源,搜出来一个js文件:
![](https://img.haomeiwen.com/i16749901/2a5c9de90b765150.png!web)
![](https://img.haomeiwen.com/i16749901/4e374bb97510852b.gif)
将其复制出来进行格式化,继续搜索compassS字符串,发现了这个header的来源函数:
![](https://img.haomeiwen.com/i16749901/7dd979210706157b.png!web)
![](https://img.haomeiwen.com/i16749901/e9776b9cd09ca972.gif)
compassS的值为变量u,其结构为下所示:
<pre>'1553669366913_95857b7e16509a775b3e62b8e5fd0944',
</pre>
可以看到变量u是由以下两个个部分组成:
- 当前时间的时间戳;
- 查询字符串、固定字符串和当前时间时间戳的MD5加密字符串的切片;
构造加密字符串
了解了这些,我们就可以来构造headers里面的compassS键了,代码如下所示:
<pre>timer = int(round(time.time() * 1000))
m = hashlib.md5()
s = 'getDetailsComPASs#123&WEb{}'.format(timer)
m.update(bytes(s,encoding='utf-8'))
l = m.hexdigest()
ll = l[6:len(l)] + l[0:6]
Python学习群:683380553,有大牛答疑,有资源共享!是一个非常不错的交流基地!欢迎喜欢Python的小伙伴!
</pre>
其中,timer是前半部分的时间戳,ll是后半部分的MD5加密字符串,我们将其拼接起来:
<pre>'compassS': '{0}_{1}'.format(timer,ll),
</pre>
再次进行请求,可以发现,请求已经成功返回了正确地数据,如下图所示:
![](https://img.haomeiwen.com/i16749901/8ce8d445734f7701.gif)
![](https://img.haomeiwen.com/i16749901/4e621739f495af3f.gif)
这样,我们就通过对加密请求头进行解密解决了接口请求限制的问题。