好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

【爬虫实战】爬两次

定义

「爬两次」这个词是我自己随便编的,意思就是要对相同的API发送两次请求。学过小学奥数的人应该知道「算两次」,就是用不同的两种方法来计算同一个东西,因为结果必然是一样的,所以可以得到两个式子间一些关系。「爬两次」和「算两次」没什么关系,扯这么多是因为我闲的蛋疼。

问题

这个问题是下午在闲鱼大佬的爬虫交流群里看到的:

网站:

 http://hd.chinatax.gov.cn/nszx/InitCredit.html  

打开开发者模式,随便点击一个省份,在Network中看一下抓到的请求:

可以看出,数据确实都直接写出来了,没有什么加密措施。

 import requests  headers = {     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',     'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',     'Referer': 'http://hd.chinatax.gov.cn/nszx/InitCredit.html', }  data = {   'page': '0',   'location': '140000',   'code': '',   'name': '',   'evalyear': '2019' }  r = requests.post('http://hd.chinatax.gov.cn/service/findCredit.do', headers=headers, data=data)  r.text  

运行一下,收到的响应为一堆html代码,并没有我们想要的数据。

解决

这种情况一般都是带的参数少了,既然form data是全的,那么很可能少的是cookie,翻回去再看一下Network:

可以看到浏览器对这个API发送了两次相同的POST请求,第一次的状态码为307,也就是临时重定向,我们需要的数据包含在第二次POST请求的响应中。

在Cookies一栏中可以看到第一次POST请求的响应中包含了第二次POST请求所需的cookie:

我们并不需要先用reuqests发送一次请求,然后第二次请求时携带保存下来的cookie,这样太麻烦了。requests库中的session就能帮我们自动完成cookie保存的工作。

 import requests  s = requests.session() headers = {     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',     'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',     'Referer': 'http://hd.chinatax.gov.cn/nszx/InitCredit.html', }  data = {   'page': '0',   'location': '140000',   'code': '',   'name': '',   'evalyear': '2019' }  r = s.post('http://hd.chinatax.gov.cn/service/findCredit.do', headers=headers, data=data) r = s.post('http://hd.chinatax.gov.cn/service/findCredit.do', headers=headers, data=data)  r.text  

联想

想一想之前写过的代码,这样的情况遇到很多次了。

比如【JS逆向】破解知乎登录加密策略中,获取验证码时要先发送GET请求,收到响应以后再发送PUT请求,才能得到验证码的图片,直接发送PUT请求收到的响应是这样的:

事实上,这里说的“验证码票据”就是第一次GET请求时返回的一个cookie:

再比如之前写的【JS逆向】破解第三方Bilibili视频下载加密策略(二),第一次请求的响应是第二次请求的参数,只不过这种比较好发现。

如果有很明显的爬虫行为,比如不带headers,或者高频访问,很容易就被对方的反爬虫系统封掉IP了,比如这样。

叨叨

这种政府的网站我平时是不会去爬的,这次爬也是抱着学习的目的,害怕网警顺着网线过来把我抓住。几乎每本爬虫书里都有一章在讲法律红线的,大都放在最后,但是我觉得应该放在最前面。众所周知,写爬虫就是在面向监狱编程,总能听说某个大佬写爬虫被抓进去了,也不知道是真是假。写爬虫纯粹是我的兴趣,毕业以后我也不可能靠爬虫吃饭,能写个抽卡机,下载个B站视频也就足够了,最多爬点图片回98发「自由贴图」。这里吐槽一下「妹子图」这个网站,封IP封的也太厉害了,爬几个帖就直接封IP,还是以后有机会搞个代理池再爬它好了。

查看更多关于【爬虫实战】爬两次的详细内容...

  阅读:35次