在编写爬虫的过程中,有些网站会设置反爬机制,对不是来源于浏览器的访问进行拒绝,此时我们会收到 403 错误响应码,或者收到“抱歉,无法访问“等字眼,这就需要在爬虫程序中修改请求的 headers 伪装浏览器访问,从而绕开网站的反爬机制获取正确的页面。
一、了解 requests 中 get 与 post 的 headers 参数
requests 发送的请求所带的请求头中 User-Agent 会标识为 python 程序发送的请求,如下所示:
import requests
url = 'https://httpbin.org/headers'
response = requests.get(url)
if response.status_code == 200:
print(response.text)
在上面的代码中,倒数第二行是对服务器返回的状态代码进行判断。这里的200就是请求成功的反馈。所有的状态代码的取值一般在 100-599 之间,超出这个范围的响应状态码就不是标准的状态响应码了。[所有的状态码]可以分成 5类:
- 100–199:信息反馈(Informational responses);
- 200–299:成功反馈(Successful responses),上面的代码的 200 status code就属于这里;
- 300–399:重定向消息(Redirection messages);
- 400–499:客户端错误响应(Client error responses),这个区间包含了我们常见的 403 和 404 错误响应码
- 500–599:服务器错误响应(Server error responses)
返回结果:
注:[https://httpbin.org]是一个开源的,用于测试网页请求的网站,比如上面的/headers的链接,将会返回所发送请求的请求头。详情请参考其官网。
User-Agent: 用户代理(英语:User Agent)指的是代表用户行为的软件代理程序所提供的对自己的一个标识符。用于标识浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。详情见维基百科词条:[User agent]
如上图所示,如果我们直接用 request 包,上来就调用 get 或者 post 方法就是干,对方的服务器会根据我们发送的**““User-Agent”: “python-requests/2.25.1””**了解到,你是用 python 调用的 request 包来访问他们的服务器的。
由于这种行为仅仅是消耗服务器资源带来成本,但是不会给对方带来任何好处(搜索引擎的爬虫除外),所以有一些网站会加入反爬机制,通过识别 headers 来拒绝对你的请求进行响应。
因此,我们需要在发送的请求中加入自定义的 headers,将我们的请求伪装成利用浏览器进行的请求。
那么,浏览器在访问网站时的 headers 是什么样的呢?我们以 IE 浏览器为例,用 IE浏览器打开 [https://httpbin.org/headers]网站,将会收到网站返回的下面 json 文件,这就是 IE浏览器的 headers。
将上面的请求头复制下来,传给 requests.get()
函数,即可将请求伪装成浏览器。
requests.get() 的语法是:requests.get(url,kwargs)
。
其中,url 是我们想要访问的链接,kwargs 是可选参数,包括params、data、json、headers、cookies、auth、files、timeout、proxies、stream、verify、cert等。常用的参数有data、headers。
import requests
url = 'https://httpbin.org/headers'
headers= {
"Accept": "image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3",
"Host": "httpbin.org",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; wbx 1.0.0; wbxapp 1.0.0; Zoom 3.6.0)",
"X-Amzn-Trace-Id": "Root=1-628b672d-4d6de7f34d15a77960784504"}
response = requests.get(url,headers=headers)
if response.status_code == 200:
print(response.text)
返回的结果变成:
上图所示,虽然我们用 Python 发送的 get 请求,但是对方服务器已经认为我们是用浏览器进行访问,这一点依旧是通过上图中的 User-Agent 这个参数进行判断。
此外,我们在应用爬虫的时候,可以随机更换其他 User-Agent 避免触发反爬。
二、查看浏览器 headers 的常用方法
上面说到的查看 headers 的方法不很常用,仅仅是用于教学作用。下面介绍两种更加常用的方法。
方法一:这种方法最为常用
在Chrome浏览器的网页上:右键 ——> 检查 ——> Network ——> Doc ——> 在 Name 里找到对应的请求文件 ——> 在右边选择 Headers 标签页,找到“Request Headers”,就可以看到我们发送给服务器的 headers。
同理,服务器在发给我们信息的时候,也会发送 Headers。我们同样在上面的选择路径,可以看到“Response Headers”。
例如上图中,我们可以查看到服务器响应返回的头信息知道响应结果的编码是utf-8,有的还可以看到服务器所用是apache或是其他web服务器。
方法二:这种方法最方便,我最喜欢
当我们需要的 headers 不止 user-agent,甚至还需要 cookies 的时候,需要手动生成的东西就比较多了。那么,有没有快速一键生成 Python 爬虫请求头的方法呢?答案是借助[https://curlconverter.com/]这个网站。具体过程如下:
1,在Chrome浏览器的网页上:右键 ——> 检查 ——> Network ——> Doc ——> 在 Name 里找到对应的请求文件
2,右键该文件,copy ——> copy as cURL (bash),注意不是【copy as cURL (cmd)】
3,打开网站,[https://curl.trillworks.com/],粘贴 cURL (bash) 到左边 curl command,右边会自动出 Python 代码
方法三:对于 Chrome 浏览器
也可以在地址栏输入
about:version
此时我们会看到自己的 user agent。
headers中有很多内容,主要常用的就是user-agent 和 host,他们是以键对的形式展现出来,如果user-agent 以字典键对形式作为headers的内容,就可以反爬成功,就不需要其他键对;否则,需要加入headers下的更多键对形式。
三、Headers 的解读
(一)User-Agent 的格式解读
User-Agent通常格式:
第一部分:Mozilla/5.0
历史原因,User-Agent里默认带有Mozilla字样。
第二部分:平台信息
Windows NT 6.1是指我使用的操作系统的版本,win7对应的就是Windows NT 6.1。
Win64; x64是指操作系统是64位的
Windows系统下:
Windows NT 5.0 // Windows 2000
Windows NT 5.1 // Windows XP
Windows NT 6.0 // Windows Vista
Windows NT 6.1 // Windows 7
Windows NT 6.2 // Windows 8
Windows NT 6.3 // Windows 8.1
Windows NT 10.0 // Windows 10
Win64; x64 // Win64 on x64
WOW64 // Win32 on x64
Linux系统下:
X11; Linux i686; // Linux,i686 版本
X11; Linux x86_64; // Linux,x86_64 版本
X11; Linux i686 on x86_64 // Linux, x86_64 的 i686 版本
macOS系统下:
Macintosh; Intel Mac OS X 10_9_0 // Intel x86 或者 x86_64
Macintosh; PPC Mac OS X 10_9_0 // PowerPC
Macintosh; Intel Mac OS X 10.12; // 不用下划线,用点
第三部分:引擎版本
通常默认为 AppleWebKit/537.36 (KHTML, like Gecko) …Safari/537.36
第四部分:浏览器版本
这里使用的浏览器版本为:Edg/80.0.361.54
(二)Cookie
主要用来保存用户信息的,例如用户名、密码等。
(三)Host
请求的服务器主机。
(四)Referrer
当前页面的上一个页面,也就是在浏览器的左上角点击“后退”时会跳转到的页面。
参考文献
点此查看:Python爬虫:requests的headers该怎么填
点此查看:Python 爬虫:requests 和 selenium 伪装 headers 和代理应对反爬机制