如何使用Java Selenium ChromeDriver绕过Cloudflare机器人检测?
如何使用Java Selenium ChromeDriver绕过Cloudflare机器人检测?
太懂这种滋味了——搜遍全网找方案,结果90%都是Python的,而自己只熟悉Java,简直崩溃。你现在的代码方向没错,但缺了Cloudflare机器人检测紧盯的那些关键细节,咱们一步步来优化。
先拆解你当前代码的核心问题:
- BrowserMobProxy这类代理工具本身会留下可被检测的特征,而且单独添加
Platform这种非标准请求头反而容易暴露自动化痕迹 - ChromeOptions的配置过于基础,完全没屏蔽Selenium/ChromeDriver的专属自动化标识
- 请求头的设置不够贴合真实浏览器的习惯,比如最关键的
User-Agent都没配置
优化后的完整Java代码(附详细注释)
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v128.network.Network; import java.time.Duration; import java.util.HashMap; import java.util.Map; public class CloudflareBypassExample { public static void main(String[] args) { // 1. 核心:配置ChromeOptions,最大程度模拟真实浏览器 ChromeOptions options = new ChromeOptions(); // 禁用Chrome的自动化检测标记,这是绕过Cloudflare的关键 options.addArguments("--disable-blink-features=AutomationControlled"); // 屏蔽自动化相关的扩展和插件 options.addArguments("--disable-extensions"); options.addArguments("--disable-plugins-discovery"); // 模拟真实用户的窗口大小 options.addArguments("--start-maximized"); // 避免沙箱模式带来的特征 options.addArguments("--no-sandbox"); options.addArguments("--disable-dev-shm-usage"); // 设置真实的User-Agent(直接复制你自己浏览器的UA更准确) String realUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"; options.addArguments("--user-agent=" + realUserAgent); // 基础配置保留,延长超时时间更贴合真实访问 options.setAcceptInsecureCerts(true); options.setEnableDownloads(true); options.setPageLoadStrategy(org.openqa.selenium.PageLoadStrategy.NORMAL); options.setPageLoadTimeout(Duration.ofSeconds(30)); options.setScriptTimeout(Duration.ofSeconds(30)); // 2. 改用Chrome DevTools设置请求头,比Proxy更隐蔽 WebDriver driver = new ChromeDriver(options); DevTools devTools = ((ChromeDriver) driver).getDevTools(); devTools.createSession(); // 启用Network面板,注入自定义请求头 devTools.send(Network.enable( java.util.Optional.empty(), java.util.Optional.empty(), java.util.Optional.empty() )); Map<String, String> customHeaders = new HashMap<>(); customHeaders.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); customHeaders.put("Accept-Encoding", "gzip, deflate, br, zstd"); customHeaders.put("Accept-Language", "en-US,en;q=0.9"); customHeaders.put("Cache-Control", "max-age=0"); customHeaders.put("Priority", "u=0, i"); customHeaders.put("Connection", "keep-alive"); devTools.send(Network.setExtraHTTPHeaders(new Network.SetExtraHTTPHeadersRequest(customHeaders))); try { // 3. 访问目标站点,加入真实用户的行为模拟 driver.get("https://solscan.io/"); // 模拟真实用户等待页面加载的节奏 Thread.sleep(3000); // 可选:添加简单交互,比如滚动页面,进一步降低机器人嫌疑 // ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight / 2)"); // Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 不要急着关闭浏览器,留时间验证是否成功绕过 // driver.quit(); } } }
额外的关键避坑技巧:
- 版本严格匹配:必须保证ChromeDriver的版本和你本地安装的Chrome浏览器版本完全一致,版本不匹配是触发Cloudflare检测的高频原因
- 放弃Proxy工具:像BrowserMobProxy这类代理会给请求添加额外标识(比如
Proxy-Connection头),反而容易被盯上,用DevTools设置请求头更隐蔽 - 模拟真实行为:Cloudflare的检测不止看请求头,还会分析用户行为——页面加载后等待几秒、滚动页面、甚至点击某个按钮,这些都能大幅降低被判定为机器人的概率
- 保持依赖更新:确保Selenium、ChromeDriver都是最新版本,旧版本的自动化特征更容易被Cloudflare识别
最后提醒:
Cloudflare的检测规则是动态更新的,没有100%万能的绕过方案,但把这些细节都做到位,大部分普通级别的Cloudflare检测都能顺利通过。要是还遇到问题,可以找找Java版的undetected-chromedriver(如果能找到可靠的依赖),它会帮你自动屏蔽更多自动化痕迹。
内容来源于stack exchange
相关产品推荐
相关产品推荐

