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

如何让Jsoup等待页面完全加载而非仅获取部分数据?

如何让Jsoup等待页面全部内容加载完成后再获取数据?

首先要明确:Jsoup本身做不到等待动态内容加载。

原因很简单:Jsoup是静态HTTP客户端+HTML解析器,它只会请求并获取服务器返回的初始HTML源码,不会执行页面中的JavaScript代码。你看到的“估值”“增长与效率”表格是页面加载完成后,通过JS异步请求接口加载的内容,这部分内容不会出现在Jsoup直接请求到的初始HTML里,和你设置的timeout参数无关——timeout只是控制HTTP请求的超时时间,管不了浏览器端的JS执行和动态加载。

要解决这个问题,有两种可行方案:

方案1:结合Selenium模拟浏览器加载

用Selenium驱动真实浏览器(如Chrome、Firefox),让浏览器完整加载页面并执行JS,等待动态内容显示后,再把页面源码传给Jsoup解析。示例代码如下:

// 初始化ChromeDriver(需提前下载对应浏览器版本的驱动)
WebDriver driver = new ChromeDriver();
driver.get("https://www.valueresearchonline.com/stocks/42508/icici-bank-ltd/");

// 显式等待"Valuation"表格区域加载完成
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h2[text()='Valuation']/following-sibling::div")));

// 获取加载完成后的完整页面源码
String fullPageSource = driver.getPageSource();
driver.quit();

// 用Jsoup解析完整源码
Document doc = Jsoup.parse(fullPageSource);
// 后续处理解析后的内容,比如提取表格数据

方案2:直接抓取动态加载的接口

打开浏览器开发者工具(F12),切换到「Network」面板,刷新页面后找到加载“估值”“增长与效率”数据的XHR/fetch请求,直接用Jsoup调用这些接口获取数据。这种方式不需要模拟浏览器,效率更高。

比如找到对应接口后,用Jsoup发送请求:

// 假设找到的估值数据接口URL如下(需实际抓包确认)
String apiUrl = "https://www.valueresearchonline.com/api/stocks/42508/valuation";
Document apiDoc = Jsoup.connect(apiUrl)
        .userAgent("Mozilla")
        .timeout(10000)
        .ignoreContentType(true) // 如果接口返回JSON,需忽略类型,后续自行解析JSON
        .get();
// 若返回JSON,可将apiDoc.text()转为JSON对象处理

总结:Jsoup本身没有等待动态内容的能力,必须结合能执行JS的工具,或者直接抓取后端接口来获取动态加载的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:20