You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Headless ChromeDriver加载页面卡顿/冻结问题技术求助

解决Headless模式下ChromeDriver卡顿冻结问题

我之前也碰到过一模一样的问题——正常模式跑ChromeDriver飞快,一开Headless就卡到怀疑人生,加载个谷歌首页都要半分钟!大概率是Headless模式的默认配置和正常浏览器差异导致的,给你几个亲测有效的排查和解决方向:

1. 切换到新版Headless模式(关键!)

旧版的--headless参数是一个简化版的浏览器环境,和正常模式差异极大,很容易出现兼容性和性能问题。Chrome 112+引入了新版Headless模式,行为更贴近正常浏览器,能解决大部分卡顿问题。替换你的Headless参数:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
# 用新版Headless,替代旧的--headless
options.add_argument("--headless=new")
# 必须设置窗口大小,避免布局计算异常导致的加载缓慢
options.add_argument("--window-size=1920,1080")

# 再补充几个优化参数
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")  # Linux环境下必加,避免权限问题
options.add_argument("--disable-dev-shm-usage")  # 解决/dev/shm内存不足的问题
options.add_argument("--disable-extensions")
options.add_argument("--disable-plugins")

driver = webdriver.Chrome(options=options)

2. 调整页面加载策略

默认的normal加载策略会等待所有资源(图片、脚本、样式)加载完成,Headless模式下某些第三方资源可能加载异常缓慢。可以改成eager模式,只等待DOM加载完成:

# 设置页面加载策略为eager
options.page_load_strategy = "eager"

如果只需要页面核心内容,甚至可以用none策略,然后手动等待目标元素出现:

options.page_load_strategy = "none"
# 打开页面后手动等待元素
driver.get("https://google.com")
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "q")))

3. 检查ChromeDriver与浏览器版本匹配

这个是老生常谈但最容易忽略的点!ChromeDriver版本必须和你的Chrome浏览器版本完全对应(小版本号也要一致)。比如Chrome是120.0.6099.109,ChromeDriver也要用120.0.6099.109版本。你可以通过chrome://version查看浏览器版本,然后下载对应版本的ChromeDriver。

4. 排查网络与资源限制

  • 代理/缓存问题:Headless模式可能不会自动继承系统代理,或者缓存机制异常。试试显式禁用缓存:options.add_argument("--disable-cache"),如果用代理,确保代理参数正确配置。
  • 系统资源不足:Headless虽然看起来轻量,但如果你的机器内存、CPU占用过高,也会导致卡顿。用任务管理器(Windows)或top(Linux)看看Chrome进程的资源占用,必要时关闭其他后台程序,或者给Chrome添加内存限制参数:options.add_argument("--max-memory=2048m")
  • 安全软件拦截:有些防火墙、杀毒软件会把Headless模式的Chrome当成异常进程拦截,导致网络请求缓慢。可以临时关闭安全软件测试一下。

5. 启用日志排查

如果以上方法都没用,开启ChromeDriver的日志功能,看看具体卡在哪一步:

options.add_argument("--enable-logging")
options.add_argument("--v=1")  # 日志级别,1是基本信息,越高越详细
# 初始化driver时指定日志路径
driver = webdriver.Chrome(options=options, service_log_path="./chromedriver.log")

查看日志里的超时、错误信息,能帮你定位具体问题。

内容的提问来源于stack exchange,提问作者A. Pecora

火山引擎 最新活动