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
相关产品推荐
相关产品推荐

