使用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
相关产品推荐
相关产品推荐

