信息发布→ 登录 注册 退出

Python爬虫怎样使用异常重试机制_Python爬虫请求失败自动重试的设置方法

发布时间:2025-11-11

点击量:
使用requests配合urllib3的重试机制是提高爬虫稳定性的常见方法,通过配置HTTPAdapter实现自动重试。示例中定义create_session_with_retry函数,利用Retry类设置总重试次数、触发重试的状态码列表、允许重试的请求方法及退避因子。tenacity库提供更灵活的重试控制,支持任意函数的指数退避重试,适用于复杂场景。对于简单需求,可手动结合try-except与循环实现重试逻辑,便于调试。生产环境推荐使用requests+urllib3组合,合理设置重试参数以避免对服务器造成压力。

python爬虫怎样使用异常重试机制_python爬虫请求失败自动重试的设置方法

爬虫在请求网页时,常会遇到网络波动、目标服务器响应慢或临时封禁等问题。为提高稳定性,加入异常重试机制非常必要。Python中可通过多种方式实现请求失败后的自动重试。

使用requests配合urllib3的重试机制

requests库底层依赖urllib3,可以通过配置HTTPAdapter来启用连接重试功能。这是最常见且稳定的方法。

以下是一个设置请求重试的示例:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
<p>def create_session_with_retry(retries=3, backoff_factor=0.5):
session = requests.Session()
retry_strategy = Retry(
total=retries,                    # 总重试次数(包含首次请求)
status_forcelist=[429, 500, 502, 503, 504],  # 遇到这些状态码时重试
method_whitelist=["GET", "POST"],             # 允许重试的请求方法
backoff_factor=backoff_factor                # 重试间隔时间增量
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
return session</p><h1>使用示例</h1><p>session = create_session_with_retry(retries=3)
try:
response = session.get("<a href="https://www.php.cn/link/874b2add857bd9bcc60635a51eb2b697">https://www.php.cn/link/874b2add857bd9bcc60635a51eb2b697</a>")
print(response.status_code)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")</p>

说明:

  • total:控制最大尝试次数,包括第一次请求。
  • status_forcelist:指定哪些HTTP状态码触发重试。
  • backoff_factor:用于计算重试延迟,公式为:{backoff factor} * (2 ** (retry count - 1))。

使用tenacity库进行通用重试控制

tenacity是一个更灵活的Python重试库,支持任意函数的重试,不限于网络请求。

千鹿Pr助手 千鹿Pr助手

智能Pr插件,融入众多AI功能和海量素材

千鹿Pr助手 128 查看详情 千鹿Pr助手
from tenacity import retry, stop_after_attempt, wait_exponential
import requests
<p>@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, max=10))
def fetch_url(url):
print(f"正在请求: {url}")
response = requests.get(url, timeout=5)
response.raise_for_status()
return response</p><h1>调用</h1><p>try:
res = fetch_url("<a href="https://www.php.cn/link/874b2add857bd9bcc60635a51eb2b697">https://www.php.cn/link/874b2add857bd9bcc60635a51eb2b697</a>")
print(res.status_code)
except requests.exceptions.RequestException as e:
print(f"最终失败: {e}")</p>

特点:

  • stop_after_attempt(n):最多尝试n次。
  • wait_exponential:指数退避策略,避免频繁请求。
  • 可结合多种条件,如异常类型过滤(retry_if_exception_type)。

手动捕获异常并循环重试

对于简单场景,可以直接使用try-except加循环实现重试逻辑。

import requests
import time
<p>def get_with_retry(url, max_retries=3, delay=1):
for i in range(max_retries):
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
return response
else:
print(f"状态码异常: {response.status_code},第{i+1}次尝试")
except requests.exceptions.RequestException as e:
print(f"请求出错: {e},第{i+1}次尝试")</p><pre class='brush:python;toolbar:false;'>    if i < max_retries - 1:
        time.sleep(delay * (2 ** i))  # 指数等待
return None

使用

resp = get_with_retry("https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635") if resp: print("请求成功") else: print("最终失败")

这种方法便于调试和自定义逻辑,适合小型项目或学习用途。

基本上就这些。根据项目复杂度选择合适的重试方案,推荐生产环境使用requests+urllib3组合,兼顾性能与可控性。重试机制虽好,也要注意设置合理次数和间隔,避免对目标服务器造成压力。

以上就是Python爬虫怎样使用异常重试机制_Python爬虫请求失败自动重试的设置方法的详细内容,更多请关注其它相关文章!


相关文章: 铁路12306的积分有效期是多久_铁路12306积分有效期说明  Django表单提交验证失败后保持字段值不刷新  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  浏览器打开即用 美图秀秀网页版入口  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  蛙漫官方正版入口 蛙漫网页在线全集免费观看  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  Go语言中JSON数据解码与字段访问指南  响应式图片在网页设计中的正确实现方法  淘宝网网页版登录入口 淘宝官方网页版快捷登录  LINUX怎么安装MySQL_LINUX数据库安装配置教程  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  Python Socket多播通信中指定源IP地址的实践指南  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  Go语言HTML解析:利用Goquery精准获取指定元素内容  React Router 嵌套组件中 URL 重定向问题的解决方案  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  必由学官方平台入口 必由学在线课堂登录地址  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  AO3同人作品网入口 AO3搜索引擎官网永久地址  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  zookeeper 都有哪些功能?  msn官网入口地址手机版 msn官方网站手机最新链接  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  Mac终端命令大全_Mac常用Terminal指令速查  解决Django多数据库/多Schema环境下外键迁移问题  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  Python实时数据流中的动态最值查找策略  12306选座系统怎么选连座_12306选座多人连坐操作方法  抖音网页版快捷访问 抖音网页版网页版入口操作教程  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  Win11网速慢怎么解决 Win11网络设置优化解除限速  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  外媒分析《GTA6》定价:卖100美元可以但真没必要! 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!