You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用HtmlUnit 2.30爬取reCaptcha服务的技术求助

爬取谷歌reCaptcha Demo页面的HtmlUnit解决方案

嘿,我来帮你搞定这个问题。首先得说清楚:reCaptcha本身就是谷歌用来阻止爬虫的,所以咱们的操作更多是模拟浏览器行为定位元素,要真正绕过验证难度极大,而且可能违反服务条款,这点先提个醒。

先看你用的HtmlUnit 2.30,这个版本确实有点老了,对现代JavaScript的支持有限,不过咱们还是能一步步调整代码来定位到reCaptcha元素:

核心问题:reCaptcha是动态加载的iframe

reCaptcha不会直接渲染在主页面里,而是嵌套在独立的iframe中,所以你直接从主表单里找元素肯定找不到。得先切换到对应的iframe,再定位元素。

修改后的完整代码示例

try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
    // 配置WebClient适配现代页面
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getOptions().setJavaScriptEnabled(true);
    webClient.getOptions().setTimeout(30000); // 延长超时时间,给JS加载留足时间
    webClient.getOptions().setCssEnabled(true);
    
    // 加载demo页面
    final HtmlPage homePage = webClient.getPage("https://www.google.com/recaptcha/api2/demo");
    
    // 等待主页面后台JS执行完成
    webClient.waitForBackgroundJavaScript(30000);
    
    // 遍历页面中的iframe,找到reCaptcha的锚点iframe
    HtmlPage captchaFrame = null;
    for (HtmlFrame frame : homePage.getFrames()) {
        String frameSrc = frame.getSrcAttribute();
        if (frameSrc != null && frameSrc.contains("recaptcha/api2/anchor")) {
            captchaFrame = (HtmlPage) frame.getEnclosedPage();
            // 等待iframe内部的JS和元素加载完成
            webClient.waitForBackgroundJavaScript(30000);
            break;
        }
    }
    
    if (captchaFrame != null) {
        // 定位reCaptcha的复选框元素
        HtmlSpan captchaCheckbox = captchaFrame.getFirstByXPath(
            "//span[@class='recaptcha-checkbox goog-inline-block recaptcha-checkbox-unchecked rc-anchor-checkbox']"
        );
        
        if (captchaCheckbox != null) {
            System.out.println("成功定位到reCaptcha复选框!");
            // 模拟点击(但注意:点击后会触发验证流程,HtmlUnit几乎无法通过真实的人机验证)
            HtmlPage afterClick = captchaCheckbox.click();
            webClient.waitForBackgroundJavaScript(30000);
            // 后续验证步骤(如图片选择)无法用HtmlUnit自动化,因为谷歌会检测浏览器指纹
        } else {
            System.out.println("未找到reCaptcha复选框元素,可能是class名已更新?");
        }
    } else {
        System.out.println("未找到reCaptcha对应的iframe");
    }
} catch (Exception e) {
    e.printStackTrace();
}

几个关键注意事项

  • 升级HtmlUnit版本:2.30是2017年的版本,对ES6+的JS支持很差,建议升级到最新稳定版,能减少很多JS执行错误。
  • reCaptcha的反爬机制:即使你成功定位并点击了复选框,谷歌会检测浏览器的行为模式、指纹(比如是否是无头浏览器),HtmlUnit很容易被识别为机器人,后续的验证步骤(图片选择、滑块等)几乎无法自动化。
  • 合规性问题:爬取带reCaptcha的页面可能违反谷歌的服务条款,建议谨慎操作。

内容的提问来源于stack exchange,提问作者Pedro Sosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:23:56