在 Python 的 requests 库中,会话(Session) 对象提供了一种更高级的请求管理方式。通过会话,您可以在多个请求之间保持某些特定参数或状态,比如共享的 cookies、HTTP headers、连接池,这使得处理需要多次请求的场景更加方便和高效。

主要优点

  1. 保持会话中的 cookies:多个请求之间可以共享 cookies,这在需要维持用户登录状态或其他会话信息的场景中非常有用。
  2. 共享 headers:在会话中,可以设置全局 headers,这样就不需要在每个请求中重复设置相同的 headers。
  3. 持久的连接:会话对象在后台保持持久的 TCP 连接,从而提高请求性能,尤其是在需要发送大量请求时。

requests Session 的基本用法

创建会话对象

通过requests.Session()来创建一个会话对象:

import requests

session = requests.Session()

在会话中发送请求

可以使用会话对象发送各种类型的请求(GET、POST、PUT 等)。会话在多个请求间保持共享的状态(如 cookies)。

response = session.get('https://httpbin.org/get')
print(response.text)

设置会话级别的 headers

可以在会话中设置全局的 headers,所有通过该会话发出的请求都会自动带上这些 headers。

session.headers.update({'User-Agent': 'my-program'})

response = session.get('https://httpbin.org/headers')
print(response.json())

你仍然可以为每个请求单独设置参数:

response = session.get('https://httpbin.org/headers', headers={'A': 'b'})

会话中的 cookies

会话会在请求间自动管理和共享 cookies。当你向某个网站发送请求并接收到 cookies 时,后续的请求会自动带上这些 cookies。

response = session.get('https://httpbin.org/cookies/set/token/123456')

response = session.get('https://httpbin.org/cookies')
print(response.json())

持久化特定的 URL 参数

会话可以预设 URL 参数,所有的请求都会带上这些参数。

session.params = {'from': 'perfcode.com'}

response = session.get('https://httpbin.org/get')
print(response.url)
https://httpbin.org/get?from=perfcode.com

身份认证

会话支持全局的身份认证设置,适用于需要身份验证的 API。

session.auth = ('user', 'pass')

response = session.get('https://httpbin.org/basic-auth/user/pass')
print(response.status_code)

关闭会话

会话使用后,可以通过close()方法关闭,以释放连接资源。

session.close()

在上下文管理器中使用会话

你可以使用上下文管理器来自动管理会话的创建和关闭。

import requests

session = requests.Session()

with requests.Session() as session:
    response = session.get('https://httpbin.org/get')
    print(response.text)