如何获取指定URL中动态加载的完整HTML及目标刷新时间
解决动态加载内容的爬取问题
方案1:使用无头浏览器模拟页面渲染
普通HTTP工具(如URLConnection、jsoup)只能获取页面初始静态HTML,无法执行JavaScript生成的动态内容。用无头浏览器可以模拟真实浏览器的加载流程,等待JS执行完毕后再获取完整DOM:
Java + Selenium 示例
- 引入Maven依赖:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>4.15.0</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-support</artifactId> <version>4.15.0</version> </dependency>
- 编写爬取代码:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.By; public class WeatherScraper { public static void main(String[] args) { // 配置无头模式 ChromeOptions options = new ChromeOptions(); options.addArguments("--headless=new"); options.addArguments("--disable-gpu"); WebDriver driver = new ChromeDriver(options); try { driver.get("https://www.weatherlink.com/embeddablePage/show/44a2d6b116484f5a8013ffad079046b9/slim"); // 等待动态内容加载,可根据实际情况调整时长或改用显式等待 Thread.sleep(3000); // 获取目标容器内容 String containerHtml = driver.findElement(By.className("embeddable-page-container")).getAttribute("innerHTML"); // 提取最后刷新时间 String refreshTime = driver.findElement(By.className("conditions")).getText(); System.out.println("容器内容:" + containerHtml); System.out.println("最后刷新时间:" + refreshTime); } catch (Exception e) { e.printStackTrace(); } finally { driver.quit(); } } }
方案2:直接调用后端API(更高效)
页面动态内容通常来自后端API接口,可通过开发者工具定位接口后直接请求,无需渲染页面:
- 打开Chrome开发者工具(F12),切换到「Network」面板,勾选「XHR」选项
- 刷新页面,找到返回天气数据的JSON接口
- 复制接口URL、请求头和参数,用HTTP工具直接请求并解析数据
Java + OkHttp 示例
import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.json.JSONObject; import java.io.IOException; public class WeatherApiScraper { public static void main(String[] args) throws IOException { OkHttpClient client = new OkHttpClient(); // 替换为实际找到的API接口URL String apiUrl = "https://api.weatherlink.com/your-target-api"; Request request = new Request.Builder() .url(apiUrl) // 复制开发者工具中看到的必要请求头 .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36") .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("请求失败:" + response); String jsonData = response.body().string(); JSONObject json = new JSONObject(jsonData); // 根据实际JSON结构提取刷新时间 String refreshTime = json.getJSONObject("data").getString("last_refresh"); System.out.println("最后刷新时间:" + refreshTime); } } }
注意事项
- 使用无头浏览器时,需安装对应版本的浏览器驱动(如ChromeDriver),确保与浏览器版本匹配
- 调用API时,需遵守网站使用条款,避免频繁请求导致IP被封禁
- 部分API可能需要携带认证信息或特定请求头,需从开发者工具中完整复制
内容的提问来源于stack exchange,提问作者Stéphane Gauthier
相关产品推荐
相关产品推荐

