首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 爬蟲實戰:Jsoup 配合 HttpClient 破解動態載入數據

     編輯:Java 相關知識

前言:靜態解析的局限

Jsoup 擅長解析靜態 HTML,但面對現代網站普遍採用的「前端渲染、異步載入」架構,單純用 Jsoup 往往只能拿到空殼頁面。以京東商品頁為例,商品價格並非寫死在 HTML 中,而是由前端 JavaScript 通過回調介面動態填充。

核心思路:尋找隱藏的 API 介面

瀏覽器開發者工具(Network 面板)是破解動態數據的關鍵。以京東商品頁 https://item.jd.com/11476104681.html 為例:

步驟 1:獲取頁面骨架

String startPage = "https://item.jd.com/11476104681.html";
Document document = Jsoup.connect(startPage)
    .userAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36")
    .get();

此時 document 已包含完整 DOM,但價格區塊為空。

步驟 2:定位價格 API

在 Network 面板過濾 XHR/Fetch,搜尋關鍵字「price」或觀察載入時序,可發現如下介面:

https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&skuIds=J_11476104681&source=item-pc

參數精簡實驗:逐個移除參數測試,最終發現只需核心參數即可:

https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&skuIds=J_11476104681&source=item-pc

步驟 3:HttpClient 直接呼叫 API

String url = "https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&skuIds=J_11476104681&source=item-pc";
String response = HttpUtils.doGet(url, null);
System.out.println(response);
// 輸出:jQuery9734926([{"id":"J_11476104681","p":"880.00","m":"980.00","op":"980.00"}]);

步驟 4:解析 JSONP 回應

回應為 JSONP 格式,需去除回調函數包裹:

String jsonStr = response.replace("jQuery9734926(", "").replace(")", "");
JSONArray array = JSON.parseArray(jsonStr);
JSONObject priceObj = array.getJSONObject(0);
String currentPrice = priceObj.getString("p");  // 現價
String maxPrice = priceObj.getString("m");      // 原價

進階場景:JS 加密/混淆數據

部分網站將數據經 JavaScript 加密/混淆後內嵌在頁面中。此時需:

  1. 定位包含數據的 <script> 標籤
  2. 分析加密邏輯(可能需配合 Node.js 執行 JS 代碼)
  3. 或使用 Selenium/Playwright 等無頭瀏覽器直接渲染獲取

架構建議:組合式爬蟲模板

將 Jsoup(靜態解析)+ HttpClient(API 呼叫)+ 無頭瀏覽器(複雜渲染)封裝為統一介面:

public interface Fetcher {
    String fetch(String url);
}

public class CompositeFetcher implements Fetcher {
    private final List<Fetcher> fetchers = Arrays.asList(
        new JsoupFetcher(),
        new ApiFetcher(),
        new HeadlessFetcher()
    );

    @Override
    public String fetch(String url) {
        for (Fetcher f : fetchers) {
            try {
                String result = f.fetch(url);
                if (isValid(result)) return result;
            } catch (Exception ignored) {}
        }
        throw new FetchException("All fetchers failed");
    }
}

總結

  • Jsoup:處理靜態頁面、列表頁、詳情頁骨架
  • HttpClient:直接呼叫內部 API 獲取動態數據(價格、評論、庫存等)
  • 關鍵技能:瀏覽器抓包分析、參數精簡驗證、JSONP/JSON 解析
  • 反爬應對:User-Agent 輪換、Cookie 維護、請求頻率控制、代理 IP 池

掌握「找 API、模擬請求、解析數據」三步曲,絕大多數動態載入場景都能應對。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved