面对非单次请求建议使用Session来发送请求
1.对动态代理的支持更好
2.比起直接request速度更快
3.不用重复复制header更方便
为什么推荐用 Session
管理代理
- 集中配置:只需在一个地方设置,后续所有请求自动复用。
- 连接复用:Session 会复用 TCP 连接,性能更优。
- 动态多层代理支持更好:在多级代理链(如先走动态调度代理,再链式转发到后端代理)场景下,普通的
requests.get(..., proxies=...)
每次都会重新建立连接,可能丢失中间代理握手或认证上下文;而Session
底层维护连接上下文,可正确建立并复用多层代理管道,避免连接失败。
Session
的其他常用功能
自定义请求头
session.headers.update({ "User-Agent": "MyCrawler/1.0", "Accept-Language": "zh-CN,zh;q=0.9", })
统一认证
session.auth = ("username", "password")
Cookie 管理
Session
会自动保存服务器返回的Set-Cookie
,并在后续请求中带上;也可手动读写session.cookies.set("token", "abcdef123456")
挂载适配器(Adapter)
可对特定协议或域名进行重试、连接池大小等高级配置from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry retries = Retry(total=3, backoff_factor=0.5) adapter = HTTPAdapter(max_retries=retries, pool_maxsize=10) session.mount("https://", adapter)
综合示例
下面的示例展示了如何在一个 Session
中同时配置代理、请求头和认证,并发起一次请求:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# 创建会话
session = requests.Session()
# 1. 代理配置
session.proxies.update({
"http": "http://用户名:密码@代理IP:端口",
"https": "http://用户名:密码@代理IP:端口",
})
# 2. 自定义请求头
session.headers.update({
"User-Agent": "MyAgent/1.0",
"Accept-Language": "zh-CN,zh;q=0.9",
})
# 3. 统一认证(如需要)
session.auth = ("api_user", "secret_pass")
# 4. 挂载带重试策略的 HTTPAdapter
retries = Retry(total=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retries)
session.mount("https://", adapter)
# 发起请求
resp = session.get("https://httpbin.org/headers", timeout=(3, 10))
print(resp.json())
注意事项
- 超时配置:建议同时指定连接和读取超时,如
timeout=(3, 10)
,防止代理卡住。 - 认证信息安全:尽量通过环境变量或配置文件读取,不要硬编码到源码。
- SOCKS 代理:使用 SOCKS5 时需安装
requests[socks]
,并写成socks5://...
。
小结
requests.Session
不仅能集中管理代理,还能轻松定制 headers、认证、Cookie、重试策略等,帮助你构建更稳定、可维护的 HTTP 客户端。