Python requests 请求慢问题排查

9次阅读

requests 请求慢通常源于 dns 解析、连接未复用、超时与 ssl 配置不当、代理及重试机制等,应优先检查 dns 缓存和 session 复用,再逐项排查 ssl 校验、代理干扰等问题。

Python requests 请求慢问题排查

Python requests 请求慢,通常不是库本身的问题,而是网络、服务端、配置或代码使用方式导致的。重点排查方向包括 DNS 解析、连接复用、超时设置、SSL 开销、代理和重试机制。

检查 DNS 解析是否拖慢请求

DNS 查询若未缓存或解析慢,会显著增加首次请求延迟。requests 默认不缓存 DNS,每次新建连接都可能触发解析。

  • tcpdumpWireshark 抓包,确认是否存在长时间 DNS 查询(如 A/AAAA 记录响应延迟)
  • 在代码中显式指定 IP 地址绕过 DNS(仅测试用):requests.get("https://1.1.1.1", headers={"Host": "example.com"})
  • 使用 dnspython 预查并缓存结果,或改用支持 DNS 缓存的 HTTP 客户端(如 httpx + trustme + custom resolver)

确认连接是否复用(Keep-Alive)生效

频繁新建 TCP 连接(尤其是 HTTPS)会带来握手开销。requests 默认启用 Keep-Alive,但实际是否复用取决于服务端响应头和会话管理方式。

  • 务必复用 Session 对象 ,避免每次用 requests.get() 创建新连接:
  • s = requests.Session(); s.get(url) —— 同一会话内自动复用连接池
  • 检查响应头是否含 Connection: keep-aliveKeep-Alive: timeout=5, max=100
  • 通过 s.adapters["https://"].poolmanager.connection_pool_kw 查看连接池大小(默认 10),高并发时可适当调大

审查超时与 SSL 配置

未设 timeout 会导致卡死;verify=True(默认)触发完整证书链校验,在某些环境(如企业代理、旧系统)中极慢。

立即学习 Python 免费学习笔记(深入)”;

  • 始终显式设置 timeout:例如 requests.get(url, timeout=(3, 7))(3 秒连通,7 秒读取)
  • 若确认环境安全,临时关闭证书验证提速(仅调试):verify=False(注意会忽略警告)
  • 升级 OpenSSL 和 certifi:旧版本证书包过大或校验逻辑低效,运行 pip install --upgrade certifi openssl
  • 禁用 TLS 1.0/1.1(部分服务强制协商旧协议):import urllib3; urllib3.util.ssl_.DEFAULT_CIPHERS += ":!TLSv1:!TLSv1.1"

排查代理、重试和中间设备干扰

本地代理、公司防火墙、CDN 或负载均衡器可能引入不可见延迟或重定向循环。

  • 关闭系统代理测试:requests.get(url, proxies={"http": None, "https": None})
  • 禁用自动重定向观察单次耗时:allow_redirects=False,再用 response.headers.get("Location") 手动处理
  • curl -v url 对比耗时,若 curl 快而 requests 慢,大概率是 Python 层配置问题(如 SSL 上下文、DNS)
  • 抓包看是否有 TCP 重传、TLS 握手失败重试、或服务端返回 429/503 触发 requests 默认重试(最多 3 次)

不复杂但容易忽略。从 DNS 和 Session 复用入手,再逐步排除 SSL 和中间环节,90% 的 requests 慢问题能定位到根因。

text=ZqhQzanResources