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