使用undetected_chromedriver无法绕过Cloudflare/Datadome,求解决方法
解决undetected_chromedriver绕过Cloudflare/Datadome验证码拦截的优化方案
针对你遇到的Cloudflare/Datadome验证码拦截问题,结合你的代码,给你几个切实可行的优化方向:
1. 修正脚本注入逻辑,覆盖更多浏览器特征
你当前只处理了navigator.webdriver,但Cloudflare还会检测其他自动化痕迹。而且undetected_chromedriver更推荐通过ChromeOptions提前注入脚本,确保页面加载前就覆盖所有可疑特征:
script = """ Object.defineProperty(navigator, 'webdriver', {get: () => undefined}); Object.defineProperty(navigator, 'plugins', {get: () => [1,2,3,4,5]}); Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']}); Object.defineProperty(window, 'chrome', {get: () => {return {runtime: {}}}}); """ # 手动指定真实Chrome UA,避免默认UA被识别 chrome_options.add_argument(f'--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36') # 统一语言设置,模拟真实用户 chrome_options.add_experimental_option('prefs', {'intl.accept_languages': 'en-US,en'})
2. 清理可疑配置,添加真实浏览器参数
--blink-settings=imagesEnabled=false会触发网站的异常检测,正常用户不会禁用图片,直接删除这个参数。同时补充以下模拟真实浏览器的配置:
chrome_options.add_argument('--start-maximized') chrome_options.add_argument('--disable-extensions') chrome_options.add_argument('--disable-popup-blocking') chrome_options.add_argument('--disable-default-apps') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--disable-features=VizDisplayCompositor')
注意:无需重复设置--disable-blink-features=AutomationControlled,undetected_chromedriver已经自动处理了这个特征。
3. 优化代理配置,减少特征暴露
如果使用seleniumwire,务必用住宅代理(数据中心代理极易被检测),同时添加exclude_hosts避免代理拦截验证相关请求:
proxy_options = { 'proxy': { 'http': 'http://your-residential-proxy:port', 'https': 'https://your-residential-proxy:port', 'no_proxy': 'localhost,127.0.0.1' }, 'exclude_hosts': ['*.cloudflare.com', '*.datadome.co'] }
如果不需要抓包,更建议用Chrome原生代理参数,避免seleniumwire带来的额外特征:
chrome_options.add_argument('--proxy-server=http://your-residential-proxy:port')
4. 确保版本匹配,优化初始化逻辑
undetected_chromedriver需要和本地Chrome版本严格对应,初始化时指定版本号能避免兼容性问题导致的特征泄露:
import undetected_chromedriver as uc import time # 初始化配置项 chrome_options = uc.ChromeOptions() # 加入上述所有优化配置 # 获取本地Chrome主版本号 chrome_version = uc.find_chrome_version() version_main = int(chrome_version.split('.')[0]) driver = uc.Chrome( options=chrome_options, seleniumwire_options=proxy_options, # 不需要抓包就删除该行 version_main=version_main ) # 访问页面后模拟人类等待,避免快速操作被检测 driver.get('https://www.dischem.co.za/') time.sleep(3)
5. 额外避坑提示
- 控制请求频率,不要频繁刷新或连续访问,模拟真实用户的操作节奏
- 如果仍被拦截,立即切换代理IP,避免IP被网站拉黑
- 可尝试手动访问网站获取正常Cookie,再通过
driver.add_cookie()注入到自动化浏览器中
内容的提问来源于stack exchange,提问作者Arunjunai Rajan
相关产品推荐
相关产品推荐

