目標頁面 `TerminalDetail.aspx` 內容由 **AJAX/定時輪詢** 動態更新,直接 `HttpClient GET` 只能拿到初始 HTML (無綠色數據表格)。
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet("https://www.wsdot.wa.gov/ferries/vesselwatch/TerminalDetail.aspx?terminalid=3");
get.setHeader("User-Agent", "Mozilla/5.0 ...");
get.setHeader("Accept", "text/html,...");
try (CloseableHttpResponse resp = client.execute(get)) {
String html = EntityUtils.toString(resp.getEntity(), "UTF-8");
Document doc = Jsoup.parse(html);
// 若表格在初始 HTML 中
Elements rows = doc.select("table#vesselTable tbody tr");
for (Element row : rows) {
String vessel = row.select("td:eq(0)").text();
String status = row.select("td:eq(1)").text();
System.out.println(vessel + " - " + status);
}
}
WebDriver driver = new ChromeDriver(); // 需 chromedriver
driver.get("https://www.wsdot.wa.gov/ferries/vesselwatch/TerminalDetail.aspx?terminalid=3");
// 等待 AJAX 完成 (顯式等待)
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("vesselTable")));
String html = driver.getPageSource(); // 含動態渲染內容
Document doc = Jsoup.parse(html);
// 同樣用 Jsoup 解析
driver.quit();
經抓包發現,該站實際呼叫:
GET https://www.wsdot.wa.gov/ferries/vesselwatch/TerminalDetail.aspx?terminalid=3&_=timestamp
// 回傳 JSON: { "Terminals": [ { "VesselName": "...", "Status": "..." } ] }
直接用 `HttpClient` 請求此 URL,解析 JSON 即可,無需解析 HTML。