Python异步爬虫中如何优雅处理429请求过于频繁错误?

陌敏吖_7255

陌敏吖_7255

2026-10-10

276人浏览

原创

遇到429应使用asyncio.sleep()配合指数退避和retry-after头解析,结合域名级semaphore限流,并记录url、状态码、退避来源、重试次数等日志。

python异步爬虫中如何优雅处理429请求过于频繁错误?

遇到429 Too Many Requests时别急着加time.sleep()

直接在协程里塞time.sleep()会阻塞整个事件循环,所有并发请求都卡住——这不是降频,是自废武功。真正该做的是让当前任务让出控制权,同时不影响其他任务运行。

正确做法是用asyncio.sleep()配合指数退避(exponential backoff),并把重试逻辑封装进可复用的装饰器或工具函数中:

  • asyncio.sleep() 是协程函数,只挂起当前 task,不阻塞 event loop
  • 首次重试延迟建议从 1 秒起步,每次失败翻倍(如 1s → 2s → 4s),避免雪崩式重试
  • 必须设最大重试次数(比如 3 次),否则可能无限等待
  • 注意:有些网站返回 429 时会在 Retry-After 响应头里给出推荐等待秒数,优先读这个值

用aiohttp.ClientSession时如何自动提取Retry-After头?

很多反爬服务(如 GitHub API、Cloudflare)会在 429 响应里带 Retry-After: 5 或 Retry-After: Tue, 15 Oct 2024 12:34:56 GMT。手动解析容易漏格式,建议统一转成秒数再 sleep。

实操建议:

  • 在 await session.get(...) 后检查 response.status == 429
  • 读取 response.headers.get('Retry-After'),若为数字字符串(如 "30"),直接转 int;若为 HTTP 日期格式,用 email.utils.parsedate_to_datetime() 转时间戳后计算差值
  • 不要依赖 Retry-After 存在——它可能为空,此时回落到你的默认退避策略

如何避免多个协程同时撞上同一个限流窗口?

单机并发爬取时,多个 asyncio.create_task() 可能几乎同时发出请求,又几乎同时收到 429,然后一起退避、一起重试,形成“重试风暴”。这不是并发问题,是协调缺失。

Galileo python sdk
Galileo python sdk

Galileo AI 平台 Python SDK 完整参考,用于评估、监控和保护 GenAI 应用,适用于构建 Python 应用。

下载

解决思路不是降低并发数,而是引入轻量级令牌桶或信号量控制出口节奏:

  • 用 asyncio.Semaphore(5) 限制同一时间最多 5 个请求发出(注意:这是并发请求数,不是连接池大小)
  • 更精细的做法是按域名维度建独立 Semaphore,比如 semaphores['example.com'] = asyncio.Semaphore(3),避免不同站点互相干扰
  • 如果目标站明确要求每秒 N 次,可用 asyncio.Queue 实现滑动窗口计数器,但多数场景下 Semaphore + 退避已足够

日志和监控不能只记“重试了”,得留证据

生产环境里,光打 logger.info("Retrying...") 没用。下次排查慢速或失败时,你根本不知道是哪个 URL、哪个 Host、第几次重试、等了多久。

关键字段必须记录:

  • 原始请求 URL(str(request.url))
  • 响应状态码和 Retry-After 值(即使为空)
  • 本次退避秒数(含来源:是头里读的,还是退避算法算的)
  • 重试次数计数(attempt=2/3 这种格式)
  • 可选:当前 asyncio.current_task().get_name() 辅助定位协程上下文

真正难的不是写重试逻辑,是让每次 429 都留下可追溯的行为痕迹——不然你以为在控频,其实只是把错误藏得更深了。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python 爬虫

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1691

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4284

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24897

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3047

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3067

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2363

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程