Python - 第三方HTTP库Requests使用详解2(请求头、Cookie、超时、代理)
作者:hangge | 2022-06-29 09:28
四、定制请求头
1,基本用法
(1)如果我们想为请求添加 HTTP 请求头(Request Header),只要简单地传递一个 dict 给 headers 参数就可以了。
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' } r = requests.get('http://httpbin.org/get?name=hangge', headers=headers) 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 秒(这样肯定超时)import requests response = requests.get('http://httpbin.org/get', timeout=0.001) print(response.text)
(2)运行是可以发现抛出了个超时异常:
六、Cookie
1,查看 cookie 信息
(1)我们这里请求百度翻译的首页,可以看到百度已经生成了一个名为 BAIDUID 的 cookie,放在 RequestsCookieJar[] 里了。由于我们本地没有保存这个 cookie 并在下一次请求时进行携带,所有下面代码每次执行百度都会生成一个新的 cookie:
import requests response = requests.get("https://fanyi.baidu.com") print(type(response.cookies), response.cookies) print("-------------------") for key, value in response.cookies.items(): print(key + "=" + value)
(2)requests 库还提供了个方法将 RequestsCookieJar 转换成 dict 字典:
import requests response = requests.get("https://fanyi.baidu.com") print(type(response.cookies), response.cookies) print("-------------------") cookies = requests.utils.dict_from_cookiejar(response.cookies) print(cookies)
2,自定义 cookie
(1)如果要在发送请求时添加某些 cookie, 最简单的方法就是设置 cookies 参数。下面我们通过字典方式构建一个 cookie,再次请求百度翻译页面,可以看到返回结果中不会有新的cookie,说明百度认为我们不是一个新的客户端请求:
import requests cookies = {'BAIDUID': 'DEBE4AEE74931831BD0406630BEC3B5C:FG=1'} response = requests.get("https://fanyi.baidu.com",cookies=cookies) print(type(response.cookies), response.cookies)
(2)构建 cookie 更专业的方式是先实例化一个 RequestCookieJar 的类,然后把值 set 进去。下面代码效果同上面是一样的:
RequestsCookieJar 的行为和字典类似,但接口更为完整,适合跨域名跨路径使用
import requests cookie_jar = requests.cookies.RequestsCookieJar() cookie_jar.set('BAIDUID', 'DEBE4AEE74931831BD0406630BEC3B5C:FG=1', domain='fanyi.baidu.com') response = requests.get("https://fanyi.baidu.com",cookies=cookies) print(type(response.cookies), response.cookies)
七、设置代理
如果需要让某些请求使用代理,可以使用 requests 的 proxies 参数进行设置:
proxies = { "http": "http://192.168.43.1:58300", "https": "https://192.168.43.1:58300" } response = requests.get("http://httpbin.org/get", proxies=proxies) print(response.text)
全部评论(0)