Selenium/Python启用Chrome无头模式时触发额外验证码验证问题
问题原因分析
- 你遇到的不一致问题核心是Chrome传统无头模式(
options.headless = True触发的模式)的运行逻辑和有头模式完全独立:传统无头模式属于Chrome的独立分支实现,默认和有头模式的用户数据隔离,哪怕指定了同一个用户配置目录,也不会读取有头模式下存储的验证cookie、本地缓存等数据。同时传统无头模式自带大量可被反爬系统识别的特征,哪怕手动修改UA也很容易被检测到,触发验证码校验。
解决方案
优先方案:使用Chrome新版无头模式(Chrome 112及以上版本支持)
新版无头模式本质是隐藏了有头模式的UI层,所有运行逻辑、用户数据读取规则、反爬特征和有头模式完全一致,是官方推出用来替代传统无头模式的方案,修改方式非常简单:
把原有代码中options.headless = True的配置替换为下面这行即可:
options.add_argument("--headless=new")
修改后不需要改动其他配置,即可正常读取你指定的./profile目录下的验证状态,不会再出现模式切换后需要重复验证的问题。
兼容方案(Chrome 112以下版本使用)
如果你的Chrome版本低于112无法使用新版无头模式,可通过补充配置抹除传统无头模式的特征,同时修复用户数据读取问题:
- 把用户配置目录的相对路径
./profile改为绝对路径,避免传统无头模式的路径读取异常 - 补充窗口大小配置,和你有头模式的窗口尺寸保持一致,避免被反爬识别:
options.add_argument("--window-size=1920,1080") - 启动 driver 后执行脚本抹除webdriver特征:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" }) - 确认你配置的user-agent字符串和你本地安装的Chrome版本完全匹配,不要使用和当前版本不符的UA。
验证方法
修改配置后可在页面加载完成后打印当前cookie,对比有头模式下的cookie内容,确认验证状态的cookie被正确读取即可:
print(driver.get_cookies())
内容的提问来源于stack exchange,提问作者reed
相关产品推荐
相关产品推荐

