普通selenium过不去cloudflare因暴露webdriver属性、navigator特征及缺乏真实行为痕迹,导致503或无限验证;需用undetected-chromedriver并配置禁用自动化扩展、排除启用开关、关闭沙箱等关键选项,且首次验证后须复用cookies与localstorage维持会话。

Cloudflare验证为什么普通Selenium过不去
Cloudflare的反爬机制会检测浏览器环境特征,比如 webdriver 属性、navigator.plugins、navigator.languages、chrome.runtime 是否存在等。标准 selenium.webdriver.Chrome 启动的浏览器几乎必然暴露 document.documentElement.outerHTML 中的 webdriver="true",且缺少真实用户行为痕迹(如鼠标移动、滚动、时间间隔),导致 503 或无限重定向。
常见错误现象包括:cloudflare check 页面卡住、返回 503 Service Temporarily Unavailable、页面加载后空白、或反复跳转到验证页。
- 不要用
options.add_argument("--disable-blink-features=AutomationControlled")单独掩盖 —— 这只是删掉一个 header,其他指纹仍暴露 - 不要手动 patch
navigator.webdriver—— Cloudflare 已支持多层 JS 检测,仅改属性无效 - 避免复用已存在的 Chrome 用户目录(
--user-data-dir)—— 可能残留旧指纹或扩展干扰
undetected-chromedriver v2 和 v3 怎么选
v2(undetected-chromedriver==2.2.1)基于旧版 ChromeDriver 封装,适配 Chrome 88–113,启动快、兼容性稳;v3(undetected-chromedriver==3.5.4)重构为独立二进制驱动管理,支持新版 Chrome(114+),但默认启用 headless 模式时易触发检测,且对某些 Linux 系统权限更敏感。
实操建议:
- Chrome 版本 ≤ 113 → 优先用
undetected-chromedriver==2.2.1,稳定省心 - Chrome ≥ 114 且需 headless → 必须加
headless=False,否则大概率被拦;或改用uc.Chrome(headless=True, options=opts)并手动禁用--headless=new - v3 默认会自动下载匹配的 ChromeDriver,若内网/代理受限,可提前下载并传入
driver_executable_path="/path/to/chromedriver"
绕过关键配置项和必须关闭的选项
即使用了 undetected-chromedriver,不关掉某些默认行为,依然会被识别。核心是“模拟真人启动流程”,而非单纯隐藏 webdriver 标志。
必须设置的参数:
- 禁用自动化提示:
options.add_experimental_option("useAutomationExtension", False) - 停用 DevTools 扩展:
options.add_experimental_option("excludeSwitches", ["enable-automation"]) - 关闭 sandbox(Linux/macOS 下必要):
options.add_argument("--no-sandbox") - 禁用共享内存(防检测):
options.add_argument("--disable-dev-shm-usage") - 指定 user-agent(与真实访问一致):
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...")
特别注意:--disable-blink-features=AutomationControlled 在 v2 中有效,在 v3 中可能反而增加风险,建议只在 v2 中使用,v3 中依赖其内置指纹抹除逻辑即可。
首次访问后怎么保持会话不被重新验证
Cloudflare 的验证结果通常绑定 cookie + TLS 指纹 + IP + 浏览器指纹四者组合。一旦通过验证,后续请求只要复用同一 session(即同一 uc.Chrome 实例 + 同一 cookies + 不清空 localStorage),一般不会重复验证。
实操要点:
- 首次访问目标页后,用
driver.get_cookies()提取 cookies,并存为requests.Session()的基础;后续接口请求可直接用 requests + 这些 cookies,无需再开浏览器 - 不要调用
driver.delete_all_cookies()或driver.execute_script("window.localStorage.clear()")—— 这会重置验证状态 - 如果需长期维持(如定时爬),建议将整个
driver实例复用,而非每次新建;或用uc.Chrome(user_data_dir="/tmp/uc-profile")持久化 profile - 遇到验证刷新,不要立即重试 —— Cloudflare 对高频重试 IP 会降权,加
time.sleep(3–8)再 reload 更稳妥
真正难的不是第一次过验证,而是让整个 session 生命周期内不被二次挑战 —— 这取决于你有没有动 cookie、localStorage、是否切换了 UA、有没有混用 requests 和 driver 请求同一域名。这些细节比换什么库更容易翻车。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











