You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:09:19