0

0

Python爬虫失败任务回收机制_稳定运行方案解析【指导】

冷漠man

冷漠man

发布时间:2025-12-27 23:12:08

|

421人浏览过

|

来源于php中文网

原创

失败任务应使用 requests + urllib3.retry 实现指数退避重试,设置 total、status_forcelist 和 backoff_factor;任务状态需持久化至 redis 或原子写入 jsonl 文件;异步爬虫中用 asyncio.timeout 包裹请求并 create_task 提交重试;超限失败任务应入死信队列并记录原因。

python爬虫失败任务回收机制_稳定运行方案解析【指导】

失败任务怎么自动重试?用 requests + 指数退避最靠谱

直接硬循环重试会触发反爬限流,requests 默认不带重试逻辑,必须手动加。核心是控制重试次数、间隔和异常类型,别一遇到 ConnectionErrorTimeout 就狂试。

  • urllib3.Retry 配合 requests.adapters.HTTPAdapter,比自己写 while 循环更可控
  • 重点设 backoff_factor(比如 0.3),它会让第 n 次重试等待 backoff_factor * (2^(n-1)) 秒,避免雪崩
  • 只对网络层错误重试,别对 404403 重试——那是业务状态,不是临时故障
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
<p>session = requests.Session()
retry_strategy = Retry(
total=3,
status_forcelist=[429, 500, 502, 503, 504],
backoff_factor=0.3,
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)

任务状态怎么持久化?别全靠内存存 queue

程序崩溃或重启后,内存里的待爬队列就丢了。得把「已取未完成」「失败待重试」的任务落地,否则回收机制形同虚设。

  • Redis 是首选:用 LPUSH/RPOP 做可靠队列,配合 BRPOP 阻塞读取,天然支持多进程/多机消费
  • 如果不用 Redis,至少用文件+原子写入:把任务 ID 和元数据(URL、重试次数、上次失败时间)存成 JSONL,每次消费前 flock 加锁
  • 别用 pickle 序列化任务对象——跨 Python 版本或代码变更后很可能反序列化失败

asyncio 爬虫里怎么安全回收失败请求?小心协程泄漏

异步环境下,没处理完的 async with session.get(...) 可能卡住整个事件循环,而且 try/except 不捕获所有异常类型。

Figma
Figma

Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。

下载
  • 必须用 asyncio.timeout() 包裹请求,防止某个 URL 死等(比如 DNS 卡住)
  • 失败后别直接 await asyncio.sleep() 然后重试——这会阻塞当前协程;改用 asyncio.create_task() 提交重试任务,并加个最大重试计数限制
  • 所有异常要显式 catch asyncio.TimeoutErroraiohttp.ClientErrorUnicodeDecodeError(响应编码异常)
import asyncio
import aiohttp
<p>async def fetch_with_retry(session, url, max_retries=2):
for i in range(max_retries + 1):
try:
async with asyncio.timeout(10):
async with session.get(url) as resp:
return await resp.text()
except (aiohttp.ClientError, asyncio.TimeoutError, UnicodeDecodeError) as e:
if i == max_retries:
raise e
await asyncio.sleep(0.5 * (2 ** i))  # 指数退避
return None

重试太多次还是失败?该进死信队列还是丢弃?

不是所有失败都要无限重试。持续失败的任务可能是目标页面已下线、参数非法、或风控永久封禁,继续重试只会浪费资源、暴露 IP。

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

  • 设定硬性重试上限(比如 5 次),超限后写入「死信队列」(redis list 名为 dead_tasks),供人工排查或定时归档
  • 记录失败原因(HTTP 状态码、异常类型、响应头 X-RateLimit-Remaining 等),别只记个 "failed"
  • 对高频失败的目标域名,自动触发降频策略:暂停该域名任务 5 分钟,或切到备用代理池

真正难的不是写重试逻辑,而是判断什么时候该停——这需要结合日志、监控和业务语义,纯技术方案兜不住所有情况。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

334

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

774

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1002

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

666

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

501

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2024.04.07

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号