如何使用Selenium绕过Cloudflare?C# ChromeDriver反复弹验证码怎么解决
针对C# Selenium ChromeDriver反复触发Cloudflare验证码的解决方案
根本原因
Cloudflare Bot Management 会采集浏览器全量指纹判定访问身份,ChromeDriver 及 Selenium 默认启动的 Chrome 实例会暴露大量独有的自动化特征(包括但不限于navigator.webdriver属性、专属启动参数、请求头标记等),这些特征不会随单次手动验证码验证消失,因此系统会持续判定为自动化访问,触发重复验证。
可落地修复方案
1. 调整Chrome启动参数抹除基础自动化标记
修改ChromeOptions配置,排除Chrome默认的自动化提示和扩展:
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; var chromeOptions = new ChromeOptions(); // 移除"Chrome正受到自动测试软件的控制"提示及相关检测标记 chromeOptions.AddExcludedArgument("enable-automation"); chromeOptions.AddAdditionalOption("useAutomationExtension", false); // 禁用 blink 层的自动化控制特征 chromeOptions.AddArgument("--disable-blink-features=AutomationControlled"); // 模拟正常用户的浏览器标识,版本号需要和你实际使用的Chrome版本对齐 chromeOptions.AddArgument("--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"); chromeOptions.AddArgument("--start-maximized"); // 可选:复用本地Chrome的用户配置,使用日常浏览的环境指纹,大幅降低被识别概率 // *注意:使用前需要完全关闭所有正在运行的Chrome进程,否则会启动冲突* // chromeOptions.AddArgument(@"--user-data-dir=C:\Users\你的系统用户名\AppData\Local\Google\Chrome\User Data"); // chromeOptions.AddArgument("--profile-directory=Default"); var driver = new ChromeDriver(chromeOptions);
2. 注入脚本覆盖浏览器特征属性
启动Driver后,执行CDP命令在所有新页面加载前覆盖Selenium留下的特征字段:
// 注入特征修正脚本 driver.ExecuteCdpCommand("Page.addScriptToEvaluateOnNewDocument", new Dictionary<string, object> { { "source", @" // 覆盖webdriver标识 Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); // 模拟正常的插件列表 Object.defineProperty(navigator, 'plugins', { get: () => Array.from({length: 5}, (_, i) => ({name: `Plugin ${i+1}`})) }); // 模拟正常的语言配置 Object.defineProperty(navigator, 'languages', { get: () => ['zh-CN', 'zh', 'en-US', 'en'] }); // 移除ChromeDriver专属的全局变量 if (window.cdc_adoQpoasnfa76pfcZLmcfl_) delete window.cdc_adoQpoasnfa76pfcZLmcfl_; " } }); // 脚本注入完成后再导航到目标站点 driver.Navigate().GoToUrl("https://你的目标站点地址");
3. 调整操作行为模拟真实用户
避免固定间隔的机械操作,所有点击、输入、滚动操作前添加随机延迟,不要在页面刚加载完成就立刻操作:
// 示例:生成2~5秒的随机等待 var random = new Random(); await Task.Delay(random.Next(2000, 5000));
如果以上方案仍无法解决,可尝试使用经过指纹修改的ChromeDriver定制版本,或者先通过其他方式获取Cloudflare验证通过后的cf_clearance cookie,再将cookie注入到Selenium会话中直接跳过验证环节。
内容的提问来源于stack exchange,提问作者codezoo
相关产品推荐
相关产品推荐

