Windows虚拟机中undetected-chromedriver随机卡死问题求助
问题描述
在Windows虚拟机中使用Selenium遍历数千个域名时,采用undetected-chromedriver会出现以下问题:
- 访问几百或几千个页面后随机卡死,已设置的60秒页面加载超时、60秒脚本超时完全不触发
- 卡死状态持续10-20分钟后,抛出类似
Timed out receiving message from renderer: -1062.446的异常,随后继续执行后续任务 - 日志显示最后一步为发送POST请求,非无头模式下可见浏览器页面已正常加载,但脚本处于冻结状态
- 将卡死的页面移至列表开头重新运行,可正常执行无问题
当前驱动配置代码:
import undetected_chromedriver as uc def setup_chromium_browser(self): self._selenium_options = uc.ChromeOptions() self._selenium_options.add_argument("--disable-renderer-backgrounding") self._selenium_options.add_argument("--disable-backgrounding-occluded-windows") self.driver = uc.Chrome( options=self._selenium_options ) self.driver.set_page_load_timeout(60) self.driver.set_script_timeout(60)
原因解析
1. 负数值超时异常的本质
Timed out receiving message from renderer: -1062.446中的负数是Chromium内核内部超时计算溢出导致的。当实际等待时间超过驱动程序预设的最大正数阈值时,数值溢出变为负数,核心问题仍是渲染进程与驱动进程的通信超时。
2. 随机卡死的核心诱因
- 渲染进程资源泄漏:长时间遍历大量域名后,Chromium渲染进程会积累内存泄漏、未释放句柄或残留的JS上下文。即便页面视觉上加载完成,后台仍可能有未结束的异步任务(如广告脚本、统计请求)占用渲染进程,导致驱动进程无法收到加载完成的信号,进而触发超长等待。
- undetected-chromedriver通信阻塞:undetected-chromedriver为绕过反爬修改了Chromium的启动和通信逻辑,但长时间运行时,驱动与Chromium的进程通信可能出现队列阻塞。例如POST请求后的响应信号被积压,驱动进程无法及时感知页面状态。
- 虚拟机资源限制:Windows虚拟机的CPU、内存或IO资源不足时,会导致Chromium进程调度延迟。即使页面加载完成,渲染进程向驱动发送信号的操作被系统调度阻塞,造成脚本层面的“假死”。
- 超时机制覆盖不全:
set_page_load_timeout仅针对页面初始加载阶段,set_script_timeout针对脚本执行,但如果页面加载完成后有后台异步任务持有渲染进程锁,这两个超时都无法触发。驱动进程会一直等待渲染进程的“空闲”信号,直到内部硬超时触发(即10-20分钟后的负数超时异常)。
3. 复现正常的原因
将卡死页面移至列表开头时,浏览器进程处于初始状态,资源充足、无残留上下文,渲染进程能快速完成所有任务并向驱动发送信号,因此不会触发卡死。
内容的提问来源于stack exchange,提问作者clueless_robot
相关产品推荐
相关产品推荐

