面对非单次请求建议使用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())

注意事项

  1. 超时配置:建议同时指定连接和读取超时,如 timeout=(3, 10),防止代理卡住。
  2. 认证信息安全:尽量通过环境变量或配置文件读取,不要硬编码到源码。
  3. SOCKS 代理:使用 SOCKS5 时需安装 requests[socks],并写成 socks5://...

小结

requests.Session 不仅能集中管理代理,还能轻松定制 headers、认证、Cookie、重试策略等,帮助你构建更稳定、可维护的 HTTP 客户端。

最后修改:2025 年 05 月 19 日
如果觉得我的文章对你有用,请随意赞赏