当前位置: > > > Python - 第三方HTTP库Requests使用详解2(请求头、Cookie、超时、代理)

Python - 第三方HTTP库Requests使用详解2(请求头、Cookie、超时、代理)

四、定制请求头

1,基本用法

(1)如果我们想为请求添加 HTTP 请求头(Request Header),只要简单地传递一个 dictheaders 参数就可以了。
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 秒内没有从基础套接字上接收到任何字节的数据时)

2,使用样例

(1)下面将超时时间设为 0.001 秒(这样肯定超时)
import requests

response = requests.get('http://httpbin.org/get', timeout=0.001)
print(response.text)

(2)运行是可以发现抛出了个超时异常:

六、Cookie

1,查看 cookie 信息

(1)我们这里请求百度翻译的首页,可以看到百度已经生成了一个名为 BAIDUIDcookie,放在 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)

七、设置代理

如果需要让某些请求使用代理,可以使用 requestsproxies 参数进行设置:
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