如何解决Python requests中HTTPSConnectionPool‘Max retries exceeded’错误?
问题分析与解决方案
你的适配器配置存在一个容易被忽略的关键问题:默认的Retry对象不会重试连接类错误(比如DNS解析失败、TCP连接超时、连接被拒绝这类场景),而你遇到的Max retries exceeded报错很多时候正是这类连接层面的问题导致的。当前配置仅针对429/5xx状态码的响应做重试,没有覆盖连接错误场景。
修正后的适配器配置
调整Retry参数,新增connect=3让连接错误也触发重试,同时明确指定allowed_methods=["GET"]避免无意中重试非幂等请求(比如POST),另外务必给请求加上超时时间,避免无限等待导致超时后无法触发重试逻辑:
from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session = requests.Session() # 修正Retry配置,覆盖连接、读错误,指定允许重试的方法 retry = Retry( total=5, # 总重试次数 backoff_factor=0.5, status_forcelist=[429, 500, 502, 503, 504], connect=3, # 连接错误重试次数 read=3, # 读超时重试次数 allowed_methods=["GET"] # 仅重试GET这类幂等请求 ) adapter = HTTPAdapter(max_retries=retry) session.mount('https://', adapter) # 添加timeout参数,连接超时5秒,读取超时15秒,可按需调整 resp = session.get( "https://url.com", headers={"Authorization": f"Bearer {token}"}, timeout=(5, 15) )
其他排查方向
- 先确认目标域名的基础连通性:用
ping或curl测试能否正常访问,排除DNS解析、服务器不可达等底层问题 - 如果目标服务器有反爬机制,补充
User-Agent等请求头模拟浏览器请求 - 若处于代理环境,检查session是否配置了正确的代理参数
内容的提问来源于stack exchange,提问作者Dalton Baum
相关产品推荐
相关产品推荐

