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

使用HtmlUnit、Jsoup无法抓取客户端渲染的网页HTML如何解决

问题根因

你尝试抓取的是客户端渲染(CSR)的单页应用(SPA),页面所有可见内容都需要JS执行完成后动态生成,初始返回的HTML仅包含空白骨架:

  • Jsoup本身不支持JavaScript执行,只能拿到初始静态HTML,所以无法获取渲染后的内容
  • 你的HtmlUnit配置存在疏漏,导致JS没有正常执行完成,最终仍只能拿到空白骨架:
    1. 主动禁用了CSS,部分现代SPA的渲染逻辑依赖CSS相关API触发,禁用CSS会导致部分JS执行中断
    2. 没有配置真实的浏览器UA,目标站点可能对异常UA做了拦截,拒绝返回渲染所需的业务数据
    3. 仅设置了固定的JS等待时长,没有校验核心节点是否完成渲染,可能JS还没执行完成就输出了页面内容
    4. HtmlUnit的模拟浏览器特征可能被目标站点的反爬策略识别,阻止了动态渲染逻辑执行
解决方案

方案1:修正HtmlUnit配置

调整配置适配站点渲染要求,参考代码如下:

try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
    // 基础异常配置
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getOptions().setUseInsecureSSL(true);
    // 开启CSS和JS支持,适配SPA渲染要求
    webClient.getOptions().setCssEnabled(true);
    webClient.getOptions().setJavaScriptEnabled(true);
    // 配置真实浏览器UA,避免被反爬拦截
    webClient.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");

    HtmlPage page = webClient.getPage(storeUrl);
    // 延长JS等待时长到15秒
    webClient.waitForBackgroundJavaScript(15000);
    // 轮询校验核心节点是否完成渲染,最多等待10秒
    int retry = 0;
    while(page.getElementById("app").getChildNodes().isEmpty() && retry < 10) {
        synchronized (page) {
            page.wait(1000);
        }
        retry++;
    }

    System.out.println(page.asXml());
}

方案2:改用真实内核的无头浏览器工具

如果调整HtmlUnit配置后仍被反爬拦截,可改用Selenium+Chrome无头模式、Playwright这类基于真实浏览器内核的工具,这类工具的运行特征和普通用户浏览器完全一致,几乎不会被反爬策略识别,核心逻辑为:启动无头浏览器 -> 访问目标页面 -> 等待节点渲染完成 -> 提取渲染后的HTML。

内容的提问来源于stack exchange,提问作者Deepak Prasad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:00:07