跳转至

Requests Session:何时使用会话

requests.Session 会在多个请求之间保留部分状态,例如 Cookie,并复用底层连接。它适合对同一公开站点连续请求时统一设置默认请求头和参数。

1. 基本用法

import requests

session = requests.Session()
session.headers.update({
    "User-Agent": "MyLearningBot/0.1 (contact: your-email@example.com)",
    "Accept": "text/html,application/xhtml+xml",
})

response = session.get("https://example.com/", timeout=10)
response.raise_for_status()

会话级 headers 会自动合并到后续请求;某一次请求传入同名 header 时,该次请求的值会覆盖会话默认值。

Session 会保存服务器在响应中设置的 Cookie。这对于公开站点的正常会话连续性很有用,但不应被用来绕过登录、付费墙、访问验证或其他访问控制。需要身份认证的数据,应先取得明确授权,并使用站点公开的、适合该用途的接口。

3. 用 with 管理资源

import requests

with requests.Session() as session:
    session.headers["User-Agent"] = "MyLearningBot/0.1"
    response = session.get("https://example.com/", timeout=10)
    response.raise_for_status()

上下文管理器会在代码块结束时关闭会话。对短脚本,这种写法能让资源生命周期更明确。

4. Session 不能替代可靠性措施

使用 Session 后仍然需要:

  • 每个请求设置 timeout
  • 调用 raise_for_status()
  • 遵守 robots、条款与频率限制;
  • 对每个响应检查内容是否符合预期。

不要把一个 Session 在多个线程间共享;如需并发,应先阅读所用库的并发安全说明,并按站点允许的频率设计任务。

参考

评论