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 时,该次请求的值会覆盖会话默认值。
2. Cookie 不是绕过权限的工具
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 在多个线程间共享;如需并发,应先阅读所用库的并发安全说明,并按站点允许的频率设计任务。