Requests - 处理会话
Requests - 管理 HTTP Session
Section titled “Requests - 管理 HTTP Session”requests 库中的 Session 对象允许您在多个请求之间保持某些参数持久化。这对于以下情况特别有用:
- Cookie 持久化: 服务器设置的 Cookie 会自动存储在 session 中,并在后续对同一域名的请求中发送。
- 连接池: 当向同一主机发出多个请求时,session 会重用底层的 TCP 连接,这可以显著提高性能。
- 默认配置: 为通过该 session 发出的所有请求设置默认的请求头 (headers)、认证 (authentication) 或查询参数 (query parameters)。
使用 Session 保持 Cookie 持久化
Section titled “使用 Session 保持 Cookie 持久化”如果您向同一主机发出多个请求,使用 Session 对象将确保 Cookie 得到正确处理,就像网络浏览器一样。
import requests
# 创建一个 Session 对象session = requests.Session()
# 发出一个设置 Cookie 的请求 (httpbin.org/cookies/set?name=value)# 此端点将重定向到 /cookies,显示已设置的 Cookie。print("Setting a cookie using a session...")response1 = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')print("Cookies after setting (from redirect to /cookies):")print(response1.json())
# 使用同一 session 向同一域名发出另一个请求# 'sessioncookie' 应该会自动发送。print("\nRequesting /cookies again to check persistence:")response2 = session.get('https://httpbin.org/cookies')print(response2.json())Setting a cookie using a session...Cookies after setting (from redirect to /cookies):{'cookies': {'sessioncookie': '123456789'}}
Requesting /cookies again to check persistence:{'cookies': {'sessioncookie': '124356789'}}如您所见,在第一次请求中设置的 sessioncookie 在对 httpbin.org/cookies 的第二次请求中自动发送了。
使用 Session 设置默认请求头
Section titled “使用 Session 设置默认请求头”您可以为 Session 对象设置默认的请求头。这些请求头将包含在该 session 发出的所有请求中。在请求方法中直接提供的请求头(例如,session.get(url, headers=...))将与 session 的请求头合并,方法特定的请求头对于相同的键具有更高的优先级。
import requests
# 创建一个 Session 对象session = requests.Session()
# 更新 session 的默认请求头session.headers.update({ 'x-custom-session-header': 'DefaultValue', 'User-Agent': 'MyCustomApp/1.0'})
print("Request with session default headers:")response1 = session.get('https://httpbin.org/headers')print(response1.json()['headers'])
print("\nRequest with session headers and method-specific headers (overriding User-Agent):")# 方法特定的请求头可以覆盖或添加到 session 请求头custom_request_headers = { 'x-custom-request-header': 'SpecificValue', 'User-Agent': 'MyCustomApp/2.0-Override'}response2 = session.get('https://httpbin.org/headers', headers=custom_request_headers)print(response2.json()['headers'])预期输出(已简化,实际顺序可能有所不同)
Section titled “预期输出(已简化,实际顺序可能有所不同)”Request with session default headers:{ "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "MyCustomApp/1.0", "X-Amzn-Trace-Id": "Root=...", "X-Custom-Session-Header": "DefaultValue"}
Request with session headers and method-specific headers (overriding User-Agent):{ "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "MyCustomApp/2.0-Override", "X-Amzn-Trace-Id": "Root=...", "X-Custom-Request-Header": "SpecificValue", "X-Custom-Session-Header": "DefaultValue"}在使用 API 进行交互时,特别是当您需要进行多次调用或处理依赖 Cookie 的认证时,使用 Session 对象是一个最佳实践。从session 对象官方文档了解更多信息。