Python限速与重试教程_请求稳定性控制

12次阅读

python中控制请求稳定性需结合限速与重试:限速应依据服务端速率限制(如X-RateLimit头)合理节制,推荐ratelimit库或手动计时;重试需针对临时错误(如超时、5xx),用tenacity实现指数退避并加抖动;二者可封装进requests.session子类统一管理,并辅以日志监控调优。

Python限速与重试教程_请求稳定性控制

Python中控制请求稳定性,核心是限速(避免触发反爬或服务限流)和重试(应对网络抖动、临时错误),二者配合使用才能让爬虫api调用更健壮。

限速:控制请求频率

限速不是简单地加time.sleep(),而是要根据目标服务的允许速率(如每秒1次、每分钟100次)合理节制。推荐用ratelimit库或time.sleep()配合计时逻辑。

  • ratelimit装饰器最直观:
    pip install ratelimit
    然后在请求函数上加@sleep_and_retry @limits(calls=5, period=60),表示每60秒最多调用5次
  • 手动限速更灵活:记录每次请求时间,下一次发起前检查间隔是否达标,适合动态调整速率的场景
  • 注意http响应头中的X-RateLimit-RemainingRetry-After,它们是服务端给出的真实限速信号,应优先遵循

重试:自动恢复临时失败

网络请求常因超时、502、503、连接中断等短暂失败,重试能显著提升成功率,但需避免无脑重试加重服务压力。

  • 推荐用tenacity库(比retrying更现代):
    pip install tenacity
    搭配@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=10))实现指数退避
  • 只对可重试错误重试:比如requests.exceptions.ConnectionErrorTimeout状态码5xx;而404401通常不该重试
  • 重试时建议加随机抖动(jitter),防止大量请求在同一时刻重试造成雪崩

requests + 限速 + 重试的一体化写法

把限速与重试封装进requests.Session子类,复用性强、逻辑集中:

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

  • 继承requests.Session,在request()方法里插入限速检查和异常捕获逻辑
  • functools.lru_cache缓存限速计时器状态(按host或endpoint维度)
  • 结合tenacity装饰内部请求方法,或直接在except块里手动循环+延时重试
  • 示例场景:调用某API每秒不超过2次,失败时最多重试3次,间隔1s→2s→4s

实际调试与监控建议

光写逻辑不够,得看得见效果,才好调优:

  • 记录每次请求耗时、状态码、是否重试、重试次数,输出到日志或简易指标(如prometheus Counter)
  • curl -v浏览器开发者工具看真实响应头,验证限速策略是否匹配服务端要求
  • 压测时观察错误率突增点,反推服务端实际限流阈值,再微调本地策略
  • 避免“过度防御”:比如对稳定内网服务也套重试+限速,反而拖慢整体性能
text=ZqhQzanResources