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

如何用Java读取HTML源码中未包含的网页内容?原代码失效求助

如何用Java读取网页中动态加载的内容

你的问题我太熟悉了——之前直接读取HTML源码的方法失效,大概率是因为网站改成了客户端渲染(比如用React、Vue或者纯JavaScript动态拉取数据并生成页面内容)。这种情况下,你直接请求URL拿到的只是一个空架子HTML,实际需要的内容是浏览器执行页面里的JavaScript后才生成的,所以原来的静态读取方法自然拿不到东西。

下面给你两个最常用的Java解决方案:

方案一:使用Selenium + 无头浏览器(推荐,模拟真实浏览器行为)

Selenium可以模拟真实浏览器的操作,包括执行JavaScript、等待页面渲染完成。我们用无头Chrome(不需要可视化界面,适合服务器运行)来实现:

步骤1:引入依赖(Maven)

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.15.0</version> <!-- 建议使用最新稳定版 -->
</dependency>
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-chrome-driver</artifactId>
    <version>4.15.0</version>
</dependency>

步骤2:编写代码

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

public class DynamicPageReader {
    public static void main(String[] args) {
        // 配置无头Chrome选项
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless=new"); // 启用无头模式
        options.addArguments("--disable-gpu");
        options.addArguments("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");

        // 初始化浏览器驱动
        WebDriver driver = new ChromeDriver(options);
        try {
            // 设置隐式等待,给浏览器足够时间加载动态内容
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            driver.get("http://piibel.net/?q=Ap%2015");

            // 获取渲染后的完整页面源码,也可以直接定位目标元素拿文本
            String pageSource = driver.getPageSource();
            // 示例:如果知道目标元素的选择器,直接提取文本
            // String targetText = driver.findElement(By.cssSelector("your-target-element")).getText();

            // 后续处理你需要的内容
            System.out.println(pageSource);
        } finally {
            // 关闭浏览器驱动
            driver.quit();
        }
    }
}

方案二:使用HtmlUnit(纯Java无头浏览器,无需额外安装浏览器)

HtmlUnit是纯Java实现的无头浏览器,内置JavaScript引擎,能直接执行页面JS并渲染内容,适合不想依赖外部浏览器的场景:

步骤1:引入依赖(Maven)

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.70.0</version> <!-- 建议使用最新稳定版 -->
</dependency>

步骤2:编写代码

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class HtmlUnitReader {
    public static void main(String[] args) {
        try (WebClient webClient = new WebClient()) {
            // 必须启用JavaScript,否则无法加载动态内容
            webClient.getOptions().setJavaScriptEnabled(true);
            // 设置等待JS执行的时间(毫秒)
            webClient.waitForBackgroundJavaScript(5000);
            // 禁用CSS渲染,提升加载速度
            webClient.getOptions().setCssEnabled(false);
            // 设置真实的User-Agent,避免被识别为爬虫
            webClient.getOptions().setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");

            // 访问目标页面
            HtmlPage page = webClient.getPage("http://piibel.net/?q=Ap%2015");
            
            // 获取渲染后的页面文本或源码
            String pageAsText = page.asText();
            String pageSource = page.asXml();

            // 处理你需要的内容
            System.out.println(pageAsText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项

  • 等待时间:一定要给足够的时间让JavaScript执行并加载内容,否则可能还是拿不到目标数据。
  • 反爬机制:部分网站会检测无头浏览器,你可能需要设置更真实的请求头、处理Cookie,甚至使用代理来规避检测。
  • 性能选择:Selenium兼容性更好,适合复杂页面;HtmlUnit纯Java实现,性能更优,适合简单动态页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:51:16