近期利用閒暇時間研究數據抓取,發現 Jsoup 操作 HTML 極為便捷。唯一美中不足是官方文檔為全英文,對英語不佳的開發者有一定門檻。特整理此筆記,記錄核心用法及常見坑點,方便日後複習。
Jsoup 所有解析操作基於 Document 對象,構建方式多樣:
Jsoup.connect(url).get() —— 從 URL 直接獲取(最常用)Jsoup.parse(htmlString) —— 從 HTML 字符串解析Jsoup.parse(file, charset) —— 從本地文件解析直接調用 Jsoup.connect(url).get() 時,控制台拋出:
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=XXX
原因:目標站點檢測請求頭,缺乏瀏覽器特徵(User-Agent、Accept-Language 等)即拒絕服務。解決方法是在連接時補全請求頭:
Document doc = Jsoup.connect(url)
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31")
.get();
加上 userAgent 後即可正常獲取頁面。生產環境建議維護一個 User-Agent 池隨機選取,進一步降低被封風險。
Document 與 Element 提供了類似 jQuery 的選擇器方法:
| 方法 | 說明 |
|---|---|
getElementsByTag(tag) | 按標籤名獲取元素集合 |
getElementsByClass(className) | 按 CSS class 獲取元素集合 |
getElementById(id) | 按 ID 獲取單個元素 |
select(cssSelector) | 支持完整 CSS 選擇器語法(推薦) |
Element 進一步操作:
children():獲取直接子元素(注意:非遞歸)text():獲取元素及其子元素的純文本內容attr(name):獲取屬性值(如 href、src)html():獲取內部 HTMLString url = "https://example.com/list";
Document doc = Jsoup.connect(url).userAgent(USER_AGENT).get();
Elements items = doc.getElementsByClass("text"); // 列表項容器
for (Element item : items) {
Element linkEl = item.children().first(); // 假設第一個子元素是鏈接
String title = linkEl.text();
String detailUrl = linkEl.attr("href");
// 進入詳情頁
Document detailDoc = Jsoup.connect(detailUrl).userAgent(USER_AGENT).get();
Element contentEl = detailDoc.getElementById("contentText");
String content = contentEl != null ? contentEl.text() : "";
System.out.println(title + " => " + content);
}
HttpStatusException、SocketTimeoutException 等。Thread.sleep,避免觸發反爬限流。Connection.Response 獲取 Cookie,後續請求帶上 .cookies(resp.cookies())。