影刀RPA 网络超时与重试机制:请求稳定性保障
影刀RPA 网络超时与重试机制请求稳定性保障作者林焱什么情况用你的影刀流程采集数据时偶尔网络波动导致请求失败整个流程就中断了有些API接口偶尔返回500错误但刷新一下就好了你想让流程在网络不稳定时自动重试而不是直接报错退出网络超时与重试机制是保障流程稳定性的核心。网络请求不可能100%成功必须有超时控制和失败重试策略。没有重试机制的流程在生产环境中根本跑不稳。本文讲清楚怎么设置合理的超时时间、怎么实现多种重试策略、怎么避免重试导致的问题。怎么做一、超时设置importrequests# 基本超时设置 # 单一超时值连接和读取都用这个时间responserequests.get(url,timeout10)# 分别设置连接超时和读取超时# (连接超时, 读取超时)responserequests.get(url,timeout(5,30))# 连接5秒读取30秒[video(video-cUSsdyfD-1784656707680)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架)]# 不同场景的超时建议 TIMEOUT_PRESETS{fast:(3,10),# 内网API、快速查询normal:(5,30),# 普通网页请求slow:(10,60),# 大数据量、慢接口download:(10,300),# 文件下载upload:(10,120),# 文件上传}二、基本重试机制importrequestsimporttimedefrequest_with_retry(url,max_retries3,timeout30,**kwargs):带重试的请求forattemptinrange(1,max_retries1):try:responserequests.get(url,timeouttimeout,**kwargs)# 检查状态码ifresponse.status_code200:returnresponse# 服务器错误5xx可以重试ifresponse.status_code500:print(f第{attempt}次请求服务器错误{response.status_code})ifattemptmax_retries:waitattempt*2# 递增等待print(f等待{wait}秒后重试...)time.sleep(wait)continue# 客户端错误4xx不重试response.raise_for_status()exceptrequests.Timeout:print(f第{attempt}次请求超时)ifattemptmax_retries:time.sleep(attempt*2)exceptrequests.ConnectionError:print(f第{attempt}次请求连接失败)ifattemptmax_retries:time.sleep(attempt*2)exceptExceptionase:print(f第{attempt}次请求异常{e})ifattemptmax_retries:time.sleep(attempt*2)print(f全部{max_retries}次重试失败)returnNone三、多种重试策略importtimeimportrandom# 策略1固定间隔重试 defretry_fixed_interval(func,max_retries3,interval2):固定间隔重试forattemptinrange(1,max_retries1):try:returnfunc()exceptExceptionase:print(f第{attempt}次失败:{e})ifattemptmax_retries:time.sleep(interval)raiseException(f重试{max_retries}次后仍失败)# 策略2递增间隔重试 defretry_incremental(func,max_retries5,base_delay1):递增间隔重试1s, 2s, 3s, 4s, 5sforattemptinrange(1,max_retries1):try:returnfunc()exceptExceptionase:print(f第{attempt}次失败:{e})ifattemptmax_retries:delaybase_delay*attemptprint(f等待{delay}秒后重试...)time.sleep(delay)raiseException(f重试{max_retries}次后仍失败)# 策略3指数退避重试推荐 defretry_exponential_backoff(func,max_retries5,base_delay1,max_delay60): 指数退避重试1s, 2s, 4s, 8s, 16s 最适合网络请求场景 forattemptinrange(1,max_retries1):try:returnfunc()exceptExceptionase:print(f第{attempt}次失败:{e})ifattemptmax_retries:delaymin(base_delay*(2**(attempt-1)),max_delay)# 加随机抖动避免同时重试jitterrandom.uniform(0,delay*0.1)total_delaydelayjitterprint(f等待{total_delay:.1f}秒后重试...)time.sleep(total_delay)raiseException(f重试{max_retries}次后仍失败)# 策略4条件重试 defretry_with_conditions(func,max_retries3,retry_on_exceptionsNone): 只对特定异常重试 retry_on_exceptionsretry_on_exceptionsor[Exception]forattemptinrange(1,max_retries1):try:returnfunc()exceptExceptionase:should_retryany(isinstance(e,exc)forexcinretry_on_exceptions)ifshould_retryandattemptmax_retries:print(f第{attempt}次失败可重试:{type(e).__name__}:{e})time.sleep(attempt*2)else:print(f第{attempt}次失败不可重试:{type(e).__name__}:{e})raiseraiseException(f重试{max_retries}次后仍失败)# 使用示例importrequests resultretry_exponential_backoff(lambda:requests.get(https://api.example.com/data,timeout10).json(),max_retries5,base_delay1)# 只对网络异常重试不对JSON解析错误重试resultretry_with_conditions(lambda:requests.get(https://api.example.com/data,timeout10).json(),max_retries3,retry_on_exceptions[requests.Timeout,requests.ConnectionError])四、使用urllib3的Retry机制fromurllib3.util.retryimportRetryfromrequests.adaptersimportHTTPAdapterimportrequestsdefcreate_session_with_retry(total_retries3,backoff_factor1,status_forcelistNone,allowed_methodsNone): 创建带自动重试的requests Session 这是requests库内置的重试机制比手动重试更底层更可靠 sessionrequests.Session()retryRetry(totaltotal_retries,# 总重试次数backoff_factorbackoff_factor,# 退避因子第n次重试等待 backoff_factor * (2^(n-1)) 秒status_forceliststatus_forcelistor[500,502,503,504],# 对这些状态码重试allowed_methodsallowed_methodsor[GET,PUT,DELETE],# 对这些HTTP方法重试raise_on_statusFalse,# 重试次数用完后不抛异常返回响应)adapterHTTPAdapter(max_retriesretry)session.mount(http://,adapter)session.mount(https://,adapter)returnsession# 使用sessioncreate_session_with_retry(total_retries3,backoff_factor1,# 等待 1s, 2s, 4sstatus_forcelist[500,502,503,504])# 这个session会自动重试responsesession.get(https://api.example.com/data,timeout30)五、完整的稳定请求封装importrequestsimporttimeimportrandomfromurllib3.util.retryimportRetryfromrequests.adaptersimportHTTPAdapterclassStableHTTPClient:稳定的HTTP客户端内置超时重试错误处理def__init__(self,timeout(5,30),max_retries3,backoff_factor1):self.timeouttimeout self.sessionrequests.Session()# 配置自动重试retryRetry(totalmax_retries,backoff_factorbackoff_factor,status_forcelist[500,502,503,504],allowed_methods[GET,POST],)adapterHTTPAdapter(max_retriesretry)self.session.mount(http://,adapter)self.session.mount(https://,adapter)defrequest(self,method,url,**kwargs):发送请求kwargs.setdefault(timeout,self.timeout)try:responseself.session.request(method,url,**kwargs)ifresponse.status_code200:return{success:True,data:response,status:200}elifresponse.status_code429:# 被限流等待后重试retry_afterint(response.headers.get(Retry-After,10))print(f被限流等待{retry_after}秒...)time.sleep(retry_after)returnself.request(method,url,**kwargs)# 递归重试else:return{success:False,status:response.status_code,error:fHTTP{response.status_code}}exceptrequests.Timeout:return{success:False,error:请求超时}exceptrequests.ConnectionError:return{success:False,error:连接失败}exceptExceptionase:return{success:False,error:str(e)}defget(self,url,paramsNone):returnself.request(GET,url,paramsparams)defpost(self,url,dataNone,jsonNone):returnself.request(POST,url,datadata,jsonjson)# 使用clientStableHTTPClient(timeout(5,30),max_retries3)resultclient.get(https://api.example.com/data,params{page:1})ifresult[success]:dataresult[data].json()print(f获取数据成功:{data})else:print(f获取数据失败:{result[error]})六、采集场景的重试策略defscrape_with_retry(url,scrape_func,max_retries3): 采集重试的组合 scrape_func: 采集函数接收response返回数据 clientStableHTTPClient(max_retriesmax_retries)forattemptinrange(1,max_retries1):resultclient.get(url)ifresult[success]:try:datascrape_func(result[data])return{success:True,data:data}exceptExceptionase:print(f第{attempt}次解析失败:{e})ifattemptmax_retries:time.sleep(attempt*2)else:print(f第{attempt}次请求失败:{result[error]})ifattemptmax_retries:time.sleep(attempt*2)return{success:False,error:全部重试失败}# 使用defparse_products(response):解析商品数据dataresponse.json()productsdata.get(items,[])ifnotproducts:raiseValueError(商品列表为空)returnproducts resultscrape_with_retry(https://api.example.com/products?page1,parse_products,max_retries3)有什么坑坑1重试导致数据重复写入现象POST请求超时了重试后成功但数据库里多了两条相同的数据。原因第一次请求可能实际已经到达服务器并处理成功了只是响应没返回网络超时。重试时又提交了一次导致重复。解决对POST/PUT等写操作设计幂等性——用唯一请求IDrequest_id服务器根据request_id判断是否已处理。或者在重试前先查询数据是否已存在。GET请求天然幂等可以安全重试。坑2重试次数太多拖慢流程现象每个请求重试5次每次等8秒一个失败请求要等40秒才放弃流程严重变慢。原因重试次数和等待时间设置不合理对注定失败的请求还在反复重试。解决根据场景调整重试参数。临时性错误超时、503可以多重试永久性错误404、401不重试。设置总超时时间上限——即使重试也不能超过某个总时间。对于采集流程一个页面失败就跳过不要影响整体进度。TEMU店群矩阵自动化运营核价报活动坑3重试时没有切换代理或UA现象被网站封IP后重试每次重试都用同一个IP和UA全部失败。原因重试时没有改变任何请求特征网站继续拒绝。解决重试时切换代理IP和User-Agent。让每次重试看起来像不同的用户访问forattemptinrange(max_retries):headers{User-Agent:get_random_ua()}proxiesget_random_proxy()responserequests.get(url,headersheaders,proxiesproxies,timeout10)坑4递归重试导致栈溢出现象用递归方式实现重试深度太大会栈溢出。解决重试用循环for/while实现不要用递归。如果必须递归设最大深度限制。坑5影刀的【尝试-异常】和Python重试混用现象在影刀中用【尝试-异常】包裹了【执行Python代码】Python代码内部也有重试逻辑导致重试次数翻倍。解决重试逻辑只在一个层面实现——要么在Python代码块内用retry逻辑要么在影刀流程层面用【尝试-异常】【循环】实现。不要两层都做重试。推荐在Python代码块内处理重试影刀层面只做异常捕获和流程控制。

相关新闻

linux 中的 pinctrl 子系统

linux 中的 pinctrl 子系统

linux 中的 pinctrl 子系统前置知识:Linux 设备模型、设备树(Device Tree)、GPIO 基本概念1. 为什么需要 pinctrl? 1.1 SoC 引脚复用的现实问题 现代 SoC 的引脚(pin)数量远小于内部外设数量,因…

2026/10/5 21:59:02 阅读更多 →
QT自定义控件之报表功能

QT自定义控件之报表功能

有时候用户需要在软件中提供报表的预览功能时,我们就无法将数据导入到第三方软件中再来打开。可能需要我们在软件中支持此项功能。 此时,我们可以通过Qpainter来实现效果 大家看下最终的呈现效果,先截张图看下 当用户点击物料A之后的效果&a…

2026/10/12 2:24:18 阅读更多 →
基于 STM32 的便携式肌电信号采集与疲劳度评估系统设计与实现

基于 STM32 的便携式肌电信号采集与疲劳度评估系统设计与实现

一、系统总体方案 本系统以 STM32 单片机为核心控制器,通过肌电电极采集人体骨骼肌表面的 sEMG 信号,经仪表放大、滤波、AD 采样后送入 MCU 进行时域 / 频域特征提取,利用 RMS(均方根)、MPF(中位频率)、MF(平均频率)等指标实时评估肌肉疲劳状态,最终通过 OLED 显示疲…

2026/10/9 22:08:24 阅读更多 →

最新新闻

问题:ubuntu与linux开发板互ping

问题:ubuntu与linux开发板互ping

一、问题原理要解决ubuntu与开发板互ping的问题,就是要使ubuntu和开发板在同一个网段上面。本次问题解决环境:开发板 和 windows 均通过wifi的方式连接网络。二、解决方法1、首先将ubuntu设置成桥接模式状态栏上方点击 虚拟机,点击 设置&…

2026/10/14 3:05:32 阅读更多 →
2026年全国3D溜溜网云渲染速度表现及选购参考指南

2026年全国3D溜溜网云渲染速度表现及选购参考指南

云渲染服务核心评估维度与行业标准当前3D设计领域数字化服务需求持续增长,云渲染服务已成为设计师提升出图效率的核心工具,不同平台的服务能力差异较大,明确统一的评估标准可帮助用户降低选型成本。对于同时承接3个家装项目、自有设备单张4K效…

2026/10/14 3:05:32 阅读更多 →
Chat2DB:开源AI数据库终端,自然语言转SQL的工程实践

Chat2DB:开源AI数据库终端,自然语言转SQL的工程实践

简介:Chat2DB是一款面向软件开发者的AI驱动型开源数据库管理工具,专为降低SQL使用门槛而设计,特别适合非数据库专家、初级开发者及数据分析师快速开展数据库查询、分析与迁移工作。资源包为项目源码压缩包(zip格式)&am…

2026/10/14 3:05:32 阅读更多 →
MySQL索引优化:从B+树原理到慢查询实战

MySQL索引优化:从B+树原理到慢查询实战

做后端开发这几年,最常被拉到群里去救火的场景,十有八九是数据库慢查询。系统跑得好好的,突然某天接口变慢、CPU飙高,一看日志全是SELECT走了全表扫描,几百万行的表一次查询几秒钟才回来。这种时候,十次里有…

2026/10/14 3:05:32 阅读更多 →
RGF_CJ 全局函数全解析:从应用生命周期、系统定时器到窗口与指针互操作

RGF_CJ 全局函数全解析:从应用生命周期、系统定时器到窗口与指针互操作

图形学桌面应用 【免费下载链接】RGF_CJ RGF是仓颉Windows系统下的通用渲染框架(兼应用开发框架)。RGF仓颉版(后续简称"RGF")基于RGF(C/C版)封装优化而来。RGF为开发者提供轻量化、安全、高性能以及高度一致性的2D渲染能…

2026/10/14 3:05:32 阅读更多 →
Python爬虫实战:手机APP数据抓取与解析全流程

Python爬虫实战:手机APP数据抓取与解析全流程

简介:这份PDF资料面向具备Python基础、对网络请求与爬虫开发感兴趣的技术爱好者与研发工程师,围绕手机APP数据传输的抓取与解析展开,重点讲解如何借助Fiddler抓包定位登录与话题接口,再通过urllib2构造HTTP请求、携带Header与表单…

2026/10/14 3:04:31 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →