Python requests配置Retry处理429限流仍报错的解决方案咨询
问题根因
你当前配置的requests重试逻辑不生效核心原因是urllib3内置的Retry类默认不会对429状态码触发重试:默认规则仅会对连接错误、读超时、5xx类服务端错误触发重试逻辑,你没有显式指定要重试429状态,因此收到限流响应时会直接返回错误结果,完全不会走指数退避流程,自然会在短时间内触发限流报错。
另外你的代码存在几个额外加剧限流的问题:
- 存在变量拼写错误:后半段循环里写的
sessions.post和前面初始化的session变量名不匹配,实际运行会直接抛异常 - 重复实现了两次分页拉取逻辑,会导致实际发送的请求量比预期高一倍,更快触达限流阈值
- 就算修正Retry配置,它的退避逻辑是请求失败后才触发等待,属于兜底逻辑,不会主动控制请求发送速率,只要你连续发请求的速度超过60次/分钟的阈值,依然会触发限流。
Retry的指数退避是单请求重试维度的计算,不是全局请求间隔控制,你之前按照退避逻辑推算的运行时长是不成立的。
可行解决方案
1. 修正Retry配置,让重试逻辑真正覆盖429场景
给Retry实例补充两个关键参数,一个是指定需要重试的状态码列表,把429加进去;另一个是放开POST请求的重试限制,因为默认Retry只会对GET、HEAD等幂等方法触发重试,你的POST请求默认不会走重试流程:
from urllib3.util import Retry from requests.adapters import HTTPAdapter import requests import time def get_request(): session = requests.Session() retry = Retry( total=5, connect=7, backoff_factor=1, # 显式指定触发重试的HTTP状态码 status_forcelist=[429, 500, 502, 503, 504], # 允许POST请求触发重试,分页拉取场景下接口无新增操作,幂等性有保障 allowed_methods=["GET", "POST"] ) adapter = HTTPAdapter(max_retries=retry) session.mount('https://', adapter) url = "https://my_url"
注意:这个修正仅能让重试逻辑兜底处理偶发的限流响应,不能替代主动限速,只要请求发送速率超过阈值,重试次数耗尽后依然会报错。
2. 主动做全局请求限速,从源头避免触达限流阈值
官方给出的限流规则是滚动1分钟内最多60次请求,折算下来平均1秒1次请求即可满足要求,留少量冗余的话可以设置每次请求间隔1.1秒,直接用time.sleep实现即可,简单场景下可靠性足够:
first_page = session.post(url) first_page.raise_for_status() first_page_data = first_page.json() yield first_page_data num_pages = first_page_data['last_page'] # 每次请求完成后等待固定间隔,保证滚动时间窗口内请求数不超限 time.sleep(1.1) for page in range(2, num_pages + 1): resp = session.post(url, params={'page': page}) resp.raise_for_status() next_page_data = resp.json() yield next_page_data time.sleep(1.1)
如果需要更平滑的限流控制,可以自行实现令牌桶算法做速率管控,固定间隔对于分页拉取这类单线程顺序请求的场景完全够用。
3. 适配接口的限流提示头
绝大多数提供限流规则的接口,会在响应头(包括429错误响应和正常响应)中携带限流相关字段:
Retry-After:触发限流时需要等待的秒数X-RateLimit-Remaining:当前时间窗口内剩余的可请求次数X-RateLimit-Reset:当前限流窗口重置的时间戳
可以在请求逻辑里读取这些字段,动态调整等待时间,比固定间隔更精准,比如遇到429时直接读取Retry-After的值等待对应时间再重试即可。
4. 清理代码中的冗余错误
- 删除重复的分页拉取循环,避免无意义的重复请求
- 修正
sessions的变量拼写错误,和初始化的session变量保持一致 - 解析JSON前先判断响应状态码,避免遇到429、5xx等错误响应时直接抛JSON解析异常。
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

