如何检测Selenium脚本所用代理的网络连接状态?
Selenium代理轮换断连问题解决方案
代理连通性检测实现
核心原则:检测必须走Selenium正在使用的代理通道,不要测本地公网连通性,否则检测结果无效。
- 轻量检测逻辑:不要用Selenium加载页面做检测,性能损耗太高。直接复用Selenium的代理配置,发超时时间极短的轻量HTTP请求判断连通性即可,示例代码(Python栈,其他语言逻辑一致):
import time import requests from selenium.common.exceptions import WebDriverException, TimeoutException # 全局统一维护代理配置,Selenium和检测逻辑共用 PROXY_ADDR = "http://你的代理IP:代理端口" PROXY_SETTING = {"http": PROXY_ADDR, "https": PROXY_ADDR} def is_proxy_connected() -> bool: try: # 请求无响应体的204接口,响应速度最快,无额外流量消耗 resp = requests.get( "https://公共204状态检测接口地址", proxies=PROXY_SETTING, timeout=3 ) return resp.status_code == 204 except Exception: return False def wait_proxy_recover(max_wait_sec=120, check_interval_sec=5): waited = 0 while waited < max_wait_sec: if is_proxy_connected(): return time.sleep(check_interval_sec) waited += check_interval_sec raise RuntimeError("代理等待超时,未正常恢复")
- 不要在每一步操作前硬插检测,冗余且拖慢执行效率。直接给所有Selenium操作加全局异常捕获:只要抛出网络相关的异常(连接中断、超时、页面加载失败类异常),自动触发代理检测+等待恢复逻辑,恢复后重试失败步骤即可。
更优的鲁棒性优化方案
比逐步骤检测更省性能、稳定性更高的组合方案:
- 先配置Selenium超时阈值,避免页面无响应卡死
初始化driver时直接设置全链路超时,覆盖代理断连的最长15秒窗口,不要用默认无限等待配置:
配置完成后,代理断连时最多15秒就会抛出异常,不会出现整个浏览器卡死无响应的情况。# 页面加载超时设15秒 driver.set_page_load_timeout(15) # 异步脚本执行超时设10秒 driver.set_script_timeout(10) # 隐式等待最长设5秒,元素查找统一用显式等待 driver.implicitly_wait(5) - 用通用重试包装所有Selenium操作
写一个统一的操作包装函数,覆盖点击、输入、页面跳转、元素查找所有常见操作:- 执行目标操作
- 如果抛出网络类异常,先调用
wait_proxy_recover()等代理恢复 - 恢复后自动重试当前操作,最多重试3次
- 如果抛出的是元素不存在、属性不匹配这类非网络异常,直接透传报错,不触发等待逻辑
- 主动错峰代理轮换(可选)
已知代理每10-12分钟自动轮换,可在脚本中记录启动时间/上次轮换时间,运行到第9-10分钟节点时主动暂停20秒,等代理轮换完成后再继续执行,避免关键操作(比如表单提交、数据校验)中途断连。
注意:固定等待30秒的逻辑灵活性很差,代理10秒恢复时会白白浪费20秒,若某次代理恢复耗时超过30秒还会直接报错,用轮询检测到恢复再继续的方式效率最高。
内容的提问来源于stack exchange,提问作者Sarvesh Dubey
相关产品推荐
相关产品推荐

