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

Jsoup 爬蟲實戰筆記:解決 403 Forbidden 及核心 API 用法詳解

     編輯:Java 綜合教學

Jsoup 爬蟲實戰筆記:從入門到反爬應對

近期利用閒暇時間研究數據抓取,發現 Jsoup 操作 HTML 極為便捷。唯一美中不足是官方文檔為全英文,對英語不佳的開發者有一定門檻。特整理此筆記,記錄核心用法及常見坑點,方便日後複習。

核心入口:Document 對象的獲取

Jsoup 所有解析操作基於 Document 對象,構建方式多樣:

  • Jsoup.connect(url).get() —— 從 URL 直接獲取(最常用)
  • Jsoup.parse(htmlString) —— 從 HTML 字符串解析
  • Jsoup.parse(file, charset) —— 從本地文件解析

實戰踩坑:403 Forbidden 與 User-Agent 偽裝

直接調用 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 池隨機選取,進一步降低被封風險。

常用 DOM 操作 API

Document 與 Element 提供了類似 jQuery 的選擇器方法:

方法說明
getElementsByTag(tag)按標籤名獲取元素集合
getElementsByClass(className)按 CSS class 獲取元素集合
getElementById(id)按 ID 獲取單個元素
select(cssSelector)支持完整 CSS 選擇器語法(推薦)

Element 進一步操作:

  • children():獲取直接子元素(注意:非遞歸)
  • text():獲取元素及其子元素的純文本內容
  • attr(name):獲取屬性值(如 href、src)
  • html():獲取內部 HTML

實戰代碼片段:鏈式抓取列表詳情

String 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);
}

避坑指南

  1. 異常處理:網絡請求務必包裹 try-catch,處理 HttpStatusException、SocketTimeoutException 等。
  2. 請求間隔:循環抓取時加入隨機 Thread.sleep,避免觸發反爬限流。
  3. Cookie 會話:需登錄的站點使用 Connection.Response 獲取 Cookie,後續請求帶上 .cookies(resp.cookies())。
  4. 動態渲染:Jsoup 只能解析靜態 HTML,若內容由 JS 渲染,需配合 Selenium/Playwright 或分析接口直調。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved