You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebDriverException报错咨询:长期运行爬虫脚本崩溃解决方案

解决Chrome WebDriver随机抛出WebDriverException的方案

这种随机触发的WebDriverException真的很磨人——我之前维护一个日均爬取上万页的爬虫系统时,也被类似的问题折腾过好几天。结合我的实战经验,给你几个针对性的排查和解决方向:

1. 锁死Chrome与ChromeDriver版本,禁用自动更新

哪怕你一开始确认了版本匹配,Chrome后台的自动更新可能在脚本运行过程中偷偷升级,导致Driver和浏览器版本不兼容,进而触发随机崩溃。

  • Windows:通过组策略(gpedit.msc)找到「计算机配置→管理模板→Google→Google Chrome→更新」,启用「禁用自动更新」策略。
  • Linux:用命令锁死Chrome版本:sudo apt-mark hold google-chrome-stable
  • Mac:在Chrome偏好设置→关于Chrome里取消自动更新,或者通过终端命令禁用更新服务。

2. 优化WebDriver超时设置与异常捕获重启

长时间运行时,部分异常页面(比如加载卡住、资源请求失败)会导致Driver无响应崩溃。可以给Driver设置合理的超时,并在捕获到WebDriverException时自动重启:

from selenium import webdriver
from selenium.common.exceptions import WebDriverException

def init_driver():
    options = webdriver.ChromeOptions()
    # 可搭配后续的优化启动参数
    driver = webdriver.Chrome(options=options)
    driver.set_page_load_timeout(60)  # 页面加载超时60秒
    driver.set_script_timeout(30)     # 脚本执行超时30秒
    return driver

driver = init_driver()

try:
    # 你的页面采集逻辑
except WebDriverException as e:
    print(f"Driver崩溃:{e},正在重启...")
    driver.quit()
    driver = init_driver()
    # 恢复当前采集任务

3. 添加Chrome启动参数,提升稳定性

默认启动参数对长时间爬虫场景不够友好,加上这些参数能大幅降低崩溃概率:

options = webdriver.ChromeOptions()
# 禁用扩展、GPU加速,避免渲染异常
options.add_argument('--disable-extensions')
options.add_argument('--disable-gpu')
# 沙箱模式在部分环境下易崩溃,禁用它
options.add_argument('--no-sandbox')
# 解决Linux下/dev/shm内存不足的问题
options.add_argument('--disable-dev-shm-usage')
# 启用远程调试端口,增强Driver与浏览器的通信稳定性
options.add_argument('--remote-debugging-port=9222')
# 禁用软件光栅化,减少渲染相关崩溃
options.add_argument('--disable-software-rasterizer')
# 以无头模式运行(如果不需要可视化),进一步降低资源占用
options.add_argument('--headless=new')

4. 定期主动重启Driver,避免内存泄漏

长时间运行后,ChromeDriver会出现内存泄漏,占用资源越来越高最终导致崩溃。可以设置定期重启机制,比如每爬取50个页面就重启一次Driver:

page_count = 0
MAX_PAGE_BEFORE_RESTART = 50

for page in target_pages:
    page_count += 1
    if page_count % MAX_PAGE_BEFORE_RESTART == 0:
        print("达到重启阈值,正在重启Driver...")
        driver.quit()
        driver = init_driver()
    # 当前页面采集逻辑

5. 开启详细日志,定位具体崩溃原因

如果以上方法还没解决,开启WebDriver的详细日志,看看崩溃前的具体错误信息,能帮你精准定位问题:

options.add_argument('--enable-logging')
options.add_argument('--v=1')  # 日志级别,1为详细模式,2更 verbose
# 或者将日志输出到指定文件
driver = webdriver.Chrome(options=options, service_log_path='webdriver.log')

日志里会记录崩溃前的页面请求、渲染状态、Driver通信细节,比如是否是某个特定页面的JS报错导致崩溃,还是网络连接断开。

6. 尝试使用undetected-chromedriver替代官方Driver

官方ChromeDriver对反爬机制的兼容性一般,而且长时间运行稳定性稍差。undetected-chromedriver是一个增强版的Driver,能自动处理版本匹配,还能规避很多浏览器检测,稳定性也更好:

import undetected_chromedriver as uc

driver = uc.Chrome()
# 用法和官方Driver基本一致,但崩溃概率低很多

这些方法我自己组合使用后,把爬虫的崩溃率从原来的日均3-5次降到了几乎为0,你可以根据自己的环境调整尝试。

内容的提问来源于stack exchange,提问作者Neue1987

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:15:36