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

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-Remaining和Retry-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.ConnectionError、Timeout、状态码5xx;而404或401通常不该重试 - 重试时建议加随机抖动(jitter),防止大量请求在同一时刻重试造成雪崩
requests + 限速 + 重试的一体化写法
把限速与重试封装进requests.Session子类,复用性强、逻辑集中:
立即学习“Python免费学习笔记(深入)”;
- 继承
requests.Session,在request()方法里插入限速检查和异常捕获逻辑 - 用
functools.lru_cache缓存限速计时器状态(按host或endpoint维度) - 结合
tenacity装饰内部请求方法,或直接在except块里手动循环+延时重试 - 示例场景:调用某API每秒不超过2次,失败时最多重试3次,间隔1s→2s→4s
实际调试与监控建议
光写逻辑不够,得看得见效果,才好调优:










