Python - 第三方HTTP库Requests使用详解2(请求头、Cookie、超时、代理)
四、定制请求头
1,基本用法
(1)如果我们想为请求添加 HTTP 请求头(Request Header),只要简单地传递一个 dict 给 headers 参数就可以了。
1 2 3 4 5 6 7 8 9 | import requests headers = { 'User-Agent' : 'Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10_14_2) \ AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 73.0 . 3683.86 Safari/ 537.36 ', 'Token' : '123456' } print(r.text) |
(2)运行程序可以看到请求头已经添加成功了:

2,注意事项
(1)定制 header 的优先级低于某些特定的信息源,例如:
- 如果在 .netrc 中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 auth= 参数,``.netrc`` 的设置就无效了。
- 如果被重定向到别的主机,授权 header 就会被删除。
- 代理授权 header 会被 URL 中提供的代理身份覆盖掉。
- 在我们能判断内容长度的情况下,header 的 Content-Length 会被改写。
(2)简单来说,Requests 不会基于定制 header 的具体情况改变自己的行为。只不过在最后的请求中,所有的 header 信息都会被传递进去。
五、超时设置
1,timeout 参数
(1)默认情况下,requests 是没有超时时长限制的,如果请求没有响应,我们的程序就会一直等待下去。
(2)我们可以使用 timeout 参数设置个时长(单位:秒),告诉 requests 在经过多长时间之后停止等待响应。
注意:timeout 仅对连接过程有效,与响应体的下载无关。
timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)
timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)
2,使用样例
(1)下面将超时时间设为 0.001 秒(这样肯定超时)1 2 3 4 | import requests print(response.text) |
(2)运行是可以发现抛出了个超时异常:

六、Cookie
1,查看 cookie 信息
(1)我们这里请求百度翻译的首页,可以看到百度已经生成了一个名为 BAIDUID 的 cookie,放在 RequestsCookieJar[] 里了。由于我们本地没有保存这个 cookie 并在下一次请求时进行携带,所有下面代码每次执行百度都会生成一个新的 cookie:

1 2 3 4 5 6 | import requests print (type(response.cookies), response.cookies) print ( "-------------------" ) for key, value in response.cookies.items(): print (key + "=" + value) |

(2)requests 库还提供了个方法将 RequestsCookieJar 转换成 dict 字典:
1 2 3 4 5 6 | import requests print (type(response.cookies), response.cookies) print ( "-------------------" ) cookies = requests.utils.dict_from_cookiejar(response.cookies) print (cookies) |

2,自定义 cookie
(1)如果要在发送请求时添加某些 cookie, 最简单的方法就是设置 cookies 参数。下面我们通过字典方式构建一个 cookie,再次请求百度翻译页面,可以看到返回结果中不会有新的cookie,说明百度认为我们不是一个新的客户端请求:
1 2 3 4 | import requests cookies = { 'BAIDUID' : 'DEBE4AEE74931831BD0406630BEC3B5C:FG=1' } print (type(response.cookies), response.cookies) |

(2)构建 cookie 更专业的方式是先实例化一个 RequestCookieJar 的类,然后把值 set 进去。下面代码效果同上面是一样的:
RequestsCookieJar 的行为和字典类似,但接口更为完整,适合跨域名跨路径使用
1 2 3 4 5 | import requests cookie_jar = requests.cookies.RequestsCookieJar() cookie_jar.set( 'BAIDUID' , 'DEBE4AEE74931831BD0406630BEC3B5C:FG=1' , domain= 'fanyi.baidu.com' ) print (type(response.cookies), response.cookies) |
七、设置代理
如果需要让某些请求使用代理,可以使用 requests 的 proxies 参数进行设置:
1 2 3 4 5 6 | proxies = { } print (response.text) |