undetected_chromedriver无头模式遭Cloudflare拦截,如何解决?
解决无头模式下undetected_chromedriver触发Cloudflare检测的问题
当启用无头模式时,Chrome会暴露独特特征被Cloudflare识别,以下是关键修复步骤:
1. 使用新版无头模式并补充必要参数
Chrome旧版无头模式与正常浏览器差异较大,改用新版--headless=new能大幅降低被检测概率,同时补充一系列伪装参数:
--headless=new:新版无头模式,行为更接近正常Chrome--window-size=1920,1080:设置真实窗口尺寸,避免默认小窗口暴露无头特征--disable-gpu:无头模式下禁用GPU加速--no-sandbox:绕过沙箱限制(部分运行环境需要)--disable-dev-shm-usage:解决内存不足引发的异常--accept-lang=en-US,en:设置浏览器语言,模拟真实用户--disable-blink-features=AutomationControlled:直接禁用自动化检测标志
2. 修正User-Agent格式
原代码中User-Agent的内部双引号会导致参数解析错误,需去掉:
options.add_argument('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36')
3. 额外CDP命令伪装浏览器属性
通过Chrome DevTools Protocol(CDP)命令进一步隐藏自动化特征,修改navigator.webdriver和模拟真实屏幕信息:
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', { 'source': ''' Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) Object.defineProperty(screen, 'width', { get: () => 1920 }) Object.defineProperty(screen, 'height', { get: () => 1080 }) ''' })
完整修改后的代码
import ssl import time ssl._create_default_https_context = ssl._create_unverified_context import undetected_chromedriver as uc from selenium import webdriver options = webdriver.ChromeOptions() # 修正后的User-Agent options.add_argument('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36') # 新版无头模式及核心参数 options.add_argument('--headless=new') options.add_argument('--window-size=1920,1080') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--accept-lang=en-US,en') options.add_argument('--disable-blink-features=AutomationControlled') driver = uc.Chrome(options=options) # 注入隐藏自动化特征的脚本 driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', { 'source': ''' Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) Object.defineProperty(screen, 'width', { get: () => 1920 }) Object.defineProperty(screen, 'height', { get: () => 1080 }) ''' }) driver.get('website_url') time.sleep(10) driver.save_screenshot('sample.png') driver.quit()
额外注意事项
- 确保undetected_chromedriver为最新版本,旧版本可能存在无头模式兼容性问题
- 避免长期使用固定User-Agent,可定期更新为当前Chrome官方UA
- 若仍触发验证码,可尝试替换固定
time.sleep为随机延迟,或模拟鼠标滚动、点击等真实用户行为
内容的提问来源于stack exchange,提问作者Aaditya Ura
相关产品推荐
相关产品推荐

