影刀RPA 网络不稳定的应对策略:断网重连与离线缓存

📅 2026/7/22 2:55:45
影刀RPA 网络不稳定的应对策略:断网重连与离线缓存
影刀RPA 网络不稳定的应对策略断网重连与离线缓存RPA最怕两件事页面改了找不到元素、网络断了请求超时。前者有排查方法论后者有点听天由命的感觉——毕竟你的电脑到目标服务器之间的网络不是你说了算的。但网络不好不等于流程必崩。这篇文章讲怎么在网络不稳定时让流程优雅降级而不崩溃。网络问题的三种表现1. 连接超时。浏览器打开网页时转了好久最后超时报错。原因是DNS解析慢、目标服务器响应慢、或中间网络设备丢包。2. 中途掉线。页面已经打开了但操作到一半网络断了。点击按钮没反应、AJAX请求失败。3. 间歇性丢包。大部分请求正常但偶尔几个请求超时。最难排查——你跑一次流程好好的下一次就崩了再下一次又好了。策略1所有网络操作加超时和重试店群矩阵自动化突破运营极限importtimeimportrequestsdefsafe_http_get(url,max_retries3,timeout30):带重试的安全HTTP GETforattemptinrange(1,max_retries1):try:responserequests.get(url,timeouttimeout)response.raise_for_status()returnresponseexceptrequests.Timeout:print(f请求超时第{attempt}次{url})exceptrequests.ConnectionError:print(f连接失败第{attempt}次{url})exceptExceptionase:print(f请求异常第{attempt}次{e})ifattemptmax_retries:wait2**attempt# 指数退避2秒、4秒、8秒print(f{wait}秒后重试...)time.sleep(wait)raiseException(f请求失败已重试{max_retries}次{url})网页操作的重试影刀里对网页操作加重试尝试次数 0 最大重试 3 WHILE 尝试次数 最大重试: TRY: 【打开网页】→ 目标URL 【等待元素】→ 确认页面加载成功 成功 → BREAK CATCH: 【日志输出】第{尝试次数1}次打开页面失败 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/76aa8900def94f8fb4e42ab99757f5cf.png#pic_center) 【等待 5 秒】 尝试次数 1 END WHILE IF 尝试次数 最大重试: 【日志输出】网络连接失败流程终止 # 发告警通知策略2网络中断检测在网络操作前主动检测网络是否可用importrequestsdefcheck_network():检测网络是否连通targets[https://www.baidu.com,https://www.qq.com,]forurlintargets:try:requests.get(url,timeout5)print(f✅ 网络连通)returnTrueexcept:continueprint(f❌ 网络不可用所有目标无法连接)returnFalse在关键操作前调一次IF NOT check_network(): 【日志输出】网络不可用等待恢复... 【等待 60 秒】 # 等一分钟再试 IF NOT check_network(): 【报警通知】→ 网络中断超过1分钟 【终止流程】策略3离线缓存兜底如果网络确实不行至少把之前成功采集的数据保存起来。写操作的重试缓存当数据库写入失败时网络问题先写到本地文件importjsonimportos cache_dirrC:\RPA_data\cacheos.makedirs(cache_dir,exist_okTrue)defsafe_db_write(conn,data):安全写入数据库失败时缓存到文件try:cursorconn.cursor()cursor.execute(INSERT INTO orders VALUES (%s, %s, %s),data)conn.commit()returnTrueexceptExceptionase:print(f数据库写入失败{e})# 缓存到本地文件cache_fileos.path.join(cache_dir,fcache_{int(time.time())}.json)withopen(cache_file,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse)print(f 数据已缓存至{cache_file})returnFalse# 网络恢复后从缓存文件补写数据库defflush_cache_to_db(conn):将缓存文件的数据写入数据库cached[fforfinos.listdir(cache_dir)iff.endswith(.json)]ifnotcached:returnprint(f发现{len(cached)}条缓存数据开始回写...)forfilenameincached:filepathos.path.join(cache_dir,filename)try:withopen(filepath,r,encodingutf-8)asf:datajson.load(f)cursorconn.cursor()cursor.execute(INSERT INTO orders VALUES (%s, %s, %s),data)conn.commit()os.remove(filepath)# 写入成功删除缓存exceptExceptionase:print(f 回写失败{filename}—{e})# 保留缓存文件下次再试在流程开始和结束时各调一次flush_cache_to_db()——把上次网络断开时缓存的数据补写进去。策略4断网后的流程暂停与恢复如果网络中断是暂时的比如WiFi切换不需要整个流程重来暂停等待即可temu店群自动化报活动案例主流程中的网络保护机制 WHILE True: TRY: 执行网络相关操作打开网页/API请求... BREAK # 成功 CATCH 网络相关异常: 【日志输出】网络异常等待恢复... # 等待30秒 【等待 30 秒】 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5feae7de1d094a5fbcd0d9b8c71235e5.png#pic_center) # 检查网络是否恢复 IF check_network(): 【日志输出】网络已恢复继续执行 CONTINUE # 回到循环体重新执行 ELSE: retry_count 1 IF retry_count 10: # 等了5分钟还没恢复 【日志输出】网络中断超过5分钟保存当前状态 【保存断点】 【报警通知】 【终止流程】策略5降低请求频率网络不好时疯狂重试只会让情况更糟。降低频率间隔拉长importtimedefadaptive_wait(base_wait2,max_wait60):自适应等待失败次数越多等待越久failures0defwait():nonlocalfailures failures1wait_timemin(base_wait*(2**failures),max_wait)time.sleep(wait_time)defreset():nonlocalfailures failures0returnwait,reset成功一次就reset计数连续失败就指数增长等待时间。在网络不可靠环境下的最佳实践关键数据操作前先做网络检测不要在不能上网时硬操作。所有写操作都有本地缓存兜底数据库写不了就写文件网络恢复后补写。重试用指数退避不要固定间隔。第一次等2秒第二次4秒第三次8秒……长时间断网要保存状态并告警而不是无限等待。10次重试后约5分钟还没恢复就该通知他人介入了。采集到内存的数据在断网前赶紧写到本地文件别让采集到的宝贵数据因为断网而丢失。作者林焱