Requests get爬虫之设置headers

前段时间,小编在抓取网页数据时,使用requests中的get方法,标注了url,却始终得不到数据。后来,经过一番尝试之后才发现,加上headers之后,想要的数据就出来了。小编不禁心生疑问:为什么要加headers呢?今天,我们就来聊一聊requests get爬虫时设置headers的相关内容。

Get方法请求指定的页面信息,并返回实体主体。语法是:requests.get(url,kwargs)。其中,url是我们想要访问的链接,kwargs是可选参数,包括params、data、json、headers、cookies、auth、files、timeout、proxies、stream、verify、cert等,常用的可选参数有data、headers。

(一)不需要设置headers

有时,get方式不设置headers可以行得通。例如,我们用get方法访问百度首页:

import requests
r1= requests.get("https://www.baidu.com")
print(r1)

结果是:

<Response [200]>

此处的200是HTTP响应的状态码的一种,200表示该请求被成功完成,所请求的资源发送到客户端。其他的部分状态码见下表:

我们把网页源代码打印出来:

print(r1.text)


表示我们使用上述代码语句成功获取了百度首页的源代码。

(二)需要设置headers

有时只标注url却得不到数据或者得不到全部数据,会显示抱歉、无法访问等字眼。
例如,我们用get方法访问一个淘宝页面:

https://item-paimai.taobao.com/pmp_item/609160317276.htm?s=pmp_detail&spm=a213x.7340941.2001.61.1aec2cb6RKlKoy

,想要得到这个网址

https://item-paimai.taobao.com/api/pmp/34078065117276/bid-list?_ksTS=1576480179404_132&callback=jsonp133

中对应的bidBasic信息。

我们点击Headers,此处的request url就是我们需要写在get里的链接。

r2=requests.get("https://item-paimai.taobao.com/api/pmp/34078065117276/bid-list?_ksTS=1576480179404_132&callback=jsonp133")
print(r2)
print(r2.text)
with open(r'g:/r2.txt','w') as f:
	f.write(r2.text)

结果是:

表示成功访问,并且返回了数据。但是小编想要的是bidBasic并不在里面,例如搜索一下第一个bidBasic的bidPrice:1900100,结果显示为无。

此时小编就感到不解了,为什么明明在preview中显示出来,而用get去抓取得时候却出现了不一样的东西?小编加上了request headers,再利用get方式来试试。

headers={
   
'accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cookie': '_tb_token_=berT80V49uJ9PFEJKGPI; cna=IhV+FpiDqRsCAXE54OSIgfFP; v=0; t=bb1c685b877ff64669f99c9dade7042c; cookie2=1e5103120f9886062722c86a5fad8c64; uc1=cookie14=UoTbm8P7LhIRQg%3D%3D; isg=BJWVw-e2ZCOuRUDfqsuI4YF0pJFFPHuu_ffxbBc6UYxbbrVg3-JZdKMoODL97mFc; l=dBMDiW9Rqv8wgDSFBOCiVZ9JHt_OSIRAguWfypeMi_5Zl681GgQOkUvZ8FJ6VjWftBTB4tm2-g29-etki6jgwbd6TCNQOxDc.',
'referer': 'https://item-paimai.taobao.com/pmp_item/609160317276.htm?s=pmp_detail&spm=a213x.7340941.2001.61.1aec2cb6RKlKoy',
'sec-fetch-mode': 'cors',
"sec-fetch-site": 'same-origin',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
'x-requested-with': 'XMLHttpRequest'
}

r3=requests.get("https://item-paimai.taobao.com/api/pmp/34078065117276/bid-list?_ksTS=1576480179404_132&callback=jsonp133",headers=headers)
print(r3)
print(r3.text)

with open(r'g:/r3.txt','w') as f:
	f.write(r3.text)

结果是:

打开源代码文件:

这一次,我们才拿到了想要的数据了。
不设置headers就进行抓取得不到目标数据,这其实是网页的一种反爬机制。一种可能是网页设置可能限制了必须要从某个页面才能点击进入下一个页面,如果直接进入后一个链接,将会识别为机器所为,不是真实的人在操作。还有可能是网页会识别采用什么终端进行访问,即headers中的user-agent,我们利用手机、平板、电脑访问同一网址可能得到不一样的页面内容就是因为这个原因。
所以,为了保险起见,我们在使用requests get爬取网页源代码时,还要加上可选参数headers。