首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 網頁爬蟲:Jsoup 解析 HTML 提取數據並導出 XML 完整實戰

     編輯:程式設計綜合問答

需求:爬取網頁數據(如商品列表、文章內容、表格數據),解析提取結構化信息,保存為 XML 供後續繪圖/分析。推薦使用 **Jsoup**(HTML 解析)+ **DOM4J/JAXB**(XML 生成),輕量且無瀏覽器依賴。

技術棧選型

任務推薦庫Maven 坐標
HTTP 請求/HTML 解析Jsoup`org.jsoup:jsoup:1.17.2`
XML 生成DOM4J (簡單) / JAXB (標準)`org.dom4j:dom4j:2.1.4` / `jakarta.xml.bind:jakarta.xml.bind-api:3.0.1` + 實現
反爬/動態渲染Selenium / Playwright / Puppeteer視情況引入

核心代碼:Jsoup 爬取 + DOM4J 生成 XML


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;

public class WebCrawlerToXml {

    public static void main(String[] args) throws Exception {
        String url = "https://example.com/products";
        String listSelector = "div.product-item";          // 列表項容器
        String nameSelector = "h3.title";                  // 名稱
        String priceSelector = "span.price";               // 價格
        String imgSelector = "img.thumb";                  // 圖片

        // 1. 獲取文檔
        Document doc = Jsoup.connect(url)
                .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
                .timeout(20000)
                .get();

        // 2. 解析提取
        Elements items = doc.select(listSelector);
        org.dom4j.Document xmlDoc = DocumentHelper.createDocument();
        Element root = xmlDoc.addElement("products");

        for (Element item : items) {
            String name = item.selectFirst(nameSelector) != null ? item.selectFirst(nameSelector).text() : "";
            String price = item.selectFirst(priceSelector) != null ? item.selectFirst(priceSelector).text() : "";
            String imgUrl = item.selectFirst(imgSelector) != null ? item.selectFirst(imgSelector).absUrl("src") : "";

            Element product = root.addElement("product");
            product.addElement("name").setText(name);
            product.addElement("price").setText(price);
            product.addElement("image").setText(imgUrl);
        }

        // 3. 寫入 XML 文件(帶縮排)
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        try (FileOutputStream fos = new FileOutputStream("products.xml");
             XMLWriter writer = new XMLWriter(fos, format)) {
            writer.write(xmlDoc);
        }
        System.out.println("XML 已生成:products.xml");
    }
}

進階:分頁爬取、去重、異常重試


public Set crawlAllPages(String baseUrl, String pageParam, int maxPages) {
    Set allUrls = new HashSet<>();
    for (int page = 1; page <= maxPages; page++) {
        String url = baseUrl + (baseUrl.contains("?") ? "&" : "?") + pageParam + "=" + page;
        try {
            Document doc = Jsoup.connect(url).timeout(30000).get();
            Elements links = doc.select("a[href]");
            for (Element link : links) {
                String href = link.absUrl("href");
                if (Pattern.matches(".*product/\\d+.*", href)) { // 正則過濾詳情頁
                    allUrls.add(href);
                }
            }
            Thread.sleep(1000); // 禮貌延遲
        } catch (Exception e) {
            System.err.println("頁面 " + page + " 爬取失敗: " + e.getMessage());
        }
    }
    return allUrls;
}

XML Schema (XSD) 設計建議




  
    
      
        
          
            
              
              
              
              
            
          
        
      
    
  

反爬蟲應對清單

  • 設定合理 `User-Agent`、 `Referer`、 `Cookie`
  • 使用代理 IP 池輪換
  • 控制請求頻率(`Thread.sleep` + 隨機抖動)
  • 遇到 JS 渲染頁面:改用 Selenium/Playwright 獲取 `page.content()` 後再用 Jsoup 解析
  • 處理驗證碼:OCR 識別或人工介入平台

合規與法律提醒

  1. 遵守目標網站 `robots.txt` 與服務條款
  2. 不爬取個人隱私、受版權保護內容
  3. 高頻爬取前評估對目標服務器壓力,必要時聯繫獲取 API 授權

掌握「Jsoup 選擇器提取 → DOM4J 構建樹 → 格式化輸出 XML」三步驟,即可快速構建穩定的網頁數據導 XML 管道。

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