需求:爬取網頁數據(如商品列表、文章內容、表格數據),解析提取結構化信息,保存為 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 | 視情況引入 |
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;
}
掌握「Jsoup 選擇器提取 → DOM4J 構建樹 → 格式化輸出 XML」三步驟,即可快速構建穩定的網頁數據導 XML 管道。