运行Selenium代码访问站点时如何避免触发Cloudflare拦截?
降低Cloudflare拦截概率的优化方案
一、Selenium指纹特征优化
这是解决拦截问题的基础调整,直接降低Cloudflare对自动化工具的识别概率:
- 放弃无头模式运行,Selenium原生无头模式会携带大量可被检测的特征(比如
navigator.webdriver标记为true、缺少正常浏览器的插件/用户行为指纹),切换为普通有头模式是成本最低的优化手段。 - 补充Chrome启动参数,修改你现有的
ChromeOptions配置:
options = webdriver.ChromeOptions() options.add_experimental_option('excludeSwitches', ['enable-logging', 'enable-automation']) options.add_experimental_option('useAutomationExtension', False) options.add_argument('--disable-blink-features=AutomationControlled') # 可选:填入你本地日常使用的Chrome用户数据路径,复用已有高信任度浏览器指纹,效果更好 # options.add_argument(r'--user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data')
- 启动浏览器后注入脚本抹去剩余自动化标识:
driver = webdriver.Chrome(options=options) driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', { 'source': ''' Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); window.chrome = { runtime: {} }; navigator.plugins = [1,2,3]; navigator.languages = ['zh-CN', 'zh', 'en']; ''' })
二、替换高频刷新逻辑,从根源减少风控触发
你目前的拦截大多来自高频整页刷新,Cloudflare对同一会话短时间内的重复刷新行为判定阈值极低,调整方案如下:
- 移除
driver.refresh()调用,改为在页面内部通过JS定期检查按钮状态、触发数据更新,不需要整页重载:
# 原有刷新逻辑替换为以下代码 check_res = driver.execute_script(''' const bookBtn = document.querySelector('#app-container > div > div:nth-child(2) > div > div:nth-child(2) > div:nth-child(2) > div:nth-child(2) > div:nth-child(1) > div > button'); if (bookBtn) { bookBtn.click(); return 1; } // 触发页面内部预约数据异步刷新,不同站逻辑可调整,此处仅为示例 window.dispatchEvent(new Event('focus')); return 0; ''') if check_res == 1: print("page found") break
- 调整轮询间隔,每个标签页的检查间隔不低于2秒,10个标签页可以改为3-5个,并行请求过多反而会触发流量异常判定。
三、其他细节优化
- 检测到Cloudflare拦截页时不要立刻重试,加入8-10秒的等待,正常浏览器环境下Cloudflare的验证盾会自动通过,不需要额外操作。
- 修正原有代码笔误:
driver.close需要改为driver.close(),避免残留浏览器进程导致的环境异常。
内容的提问来源于stack exchange,提问作者Hinson Chan
相关产品推荐
相关产品推荐

