如何解决Python Selenium报错tried to run command without establishing a connection
报错原因
- 浏览器/驱动进程资源泄漏崩溃:全局仅初始化了一次Firefox驱动实例,长时间循环加载大量页面的过程中,浏览器会累积缓存、内存占用持续升高,最终触发进程崩溃,导致geckodriver和浏览器之间的连接被断开,后续所有调用driver的操作都会抛出连接不存在的错误。
- 异常页面触发断连:采集过程中如果遇到响应异常、反爬拦截的页面,可能导致浏览器无响应,驱动会主动断开和浏览器的连接,现有代码没有重连逻辑,断连后所有请求都会失败。
- 系统资源不足:长时间高负载运行时,系统可能为了保障整体稳定性主动杀掉占用资源过高的浏览器进程,直接导致连接中断。
解决方案
1. 新增连接存活检测+自动重连逻辑
每次调用driver操作前先检测连接是否正常,一旦检测到断连就自动重新初始化驱动实例,示例代码如下:
from selenium.webdriver import Firefox, Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.common.exceptions import TimeoutException, WebDriverException import time options = Options() options.add_argument('--headless') # 新增优化参数降低资源占用 options.add_argument('--disable-gpu') options.add_argument('--disable-images') options.add_argument('--disk-cache-size=0') driver = None driver_path = 'C:/Program Files/Mozilla Firefox/geckodriver' # 初始化/重连驱动的工具函数 def init_driver(): global driver if driver: try: driver.quit() except: pass driver = Firefox(options=options, executable_path=driver_path) # 首次初始化驱动 init_driver() def get_attack_mention_count(mention,srch_resultsQ): global driver totalQ=0 page_count = 0 # 每处理30个页面主动重启一次驱动,避免资源累积 restart_threshold = 30 for result in srch_resultsQ: page_count +=1 if page_count % restart_threshold == 0: init_driver() url=result['link'][2]['@href'] # 每次get前先检测连接是否正常 try: # 调用轻量driver操作校验连接状态 _ = driver.current_url except WebDriverException: # 连接异常,重新初始化驱动 init_driver() try: driver.get(url) except WebDriverException: print("连接异常,重试加载URL:",url) init_driver() driver.get(url) print("URL:",url) time.sleep(3) delay = 20 # 秒 try: myElem = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.CLASS_NAME, 'Highlight-module__1p2SO'))) print ("页面加载完成!") except TimeoutException: print ("页面加载超时!") continue except: print ("页面加载出现异常") continue text_elements = driver.find_elements_by_class_name("Highlight-module__1p2SO") for element in text_elements: element_text=element.text count = sum(element_text.replace("-"," ").upper().count(x.upper().replace("-"," ")) for x in mention) print("匹配计数:",count) totalQ+=count print("当前页面处理完成,关键词",mention,"累计计数: ",totalQ) print ("总匹配次数= ",totalQ) return totalQ
2. 优化驱动资源占用
给启动参数增加禁用GPU、禁用图片、限制缓存大小的配置,降低浏览器内存增长速度,延长驱动稳定运行的时间。
3. 定期主动重启驱动
设置阈值,每处理固定数量的页面就主动quit旧驱动、启动新驱动,从根源上避免资源累积导致的崩溃问题。
内容的提问来源于stack exchange,提问作者Travelling Salesman
相关产品推荐
相关产品推荐

