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

Java 實作簡易網路小說爬蟲:Jsoup 解析 HTML、多章節自動下載、TXT 落盤

     編輯:Java 相關知識

前言:從「想看小說」到「寫個爬蟲」

看到心儀小說卻無離線下載功能?動手寫個 Java 爬蟲吧!本文展示如何使用 Jsoup 這款強大的 HTML 解析庫,配合基本 I/O,實作一個「輸入目錄頁 URL → 自動遍歷所有章節 → 清洗內容 → 合併存為 TXT」的完整小說下載器。代碼簡潔、邏輯清晰,適合作為爬蟲入門實戰與後續擴展基礎。


核心依賴

<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.16.1</version> </dependency>

完整實作代碼 (Doggie.java)

package com.example.novel; import java.io.*; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; public class NovelCrawler { public static void main(String[] args) { try { File output = new File("D:/novel/無限崩壞.txt"); createFile(output); downloadNovel(output); } catch (Exception e) { e.printStackTrace(); } } private static void downloadNovel(File file) throws IOException, InterruptedException { // 寫入書名/作者資訊 append(file, buildHeader("無限崩壞", "啪啪啪狂魔")); // 章節 URL 模板:{pattern} 為章節 ID String urlTemplate = "https://www.example.com/View/12/12653/{pattern}.html"; // 實際需替換為真實站點 // 章節 ID 範圍 (需人工確認或解析目錄頁獲取) for (int id = 5850686; id <= 5945501; id++) { try { String url = urlTemplate.replace("{pattern}", String.valueOf(id)); String content = fetchChapter(url); append(file, content); // 禮貌延遲,避免被封 IP Thread.sleep(100); } catch (Exception e) { System.err.println("章節 " + id + " 下載失敗: " + e.getMessage()); // 記錄失敗 ID 可選 } } } private static String fetchChapter(String url) throws IOException { Document doc = Jsoup.connect(url) .userAgent("Mozilla/5.0") .timeout(10000) .get(); // 1. 取得標題 Elements titleEl = doc.select("#title"); String title = titleEl.text(); // 2. 取得正文內容 Elements contentEl = doc.select(".text p"); // 3. 清洗:移除廣告、腳本、內聯樣式、超連結 contentEl.select("font, script, ins, a, style").remove(); // 4. 組裝:標題 + 內容 (段落換行) String body = contentEl.html() .replaceAll("<p>", "") .replaceAll("</p>", System.lineSeparator()) .replaceAll("<br>", System.lineSeparator()) .replaceAll(" ", " ") .replaceAll("<!--.*?-->", ""); return title + System.lineSeparator() + body + System.lineSeparator() + System.lineSeparator(); } private static String buildHeader(String book, String author) { String line = "--------------------------------------------------"; return line + System.lineSeparator() + "書名:" + book + System.lineSeparator() + "作者:" + author + System.lineSeparator() + "來源:Java 爬蟲自動下載" + System.lineSeparator() + line + System.lineSeparator() + System.lineSeparator(); } private static void createFile(File file) throws IOException { file.getParentFile().mkdirs(); file.createNewFile(); } private static void append(File file, String content) throws IOException { try (FileWriter fw = new FileWriter(file, true)) { fw.write(content); } } }

關鍵技術點解析

環節技術/方法說明
HTML 解析Jsoup.connect().get()自動處理重定向、Cookie、編碼,支援 CSS 選擇器
元素選取doc.select("#title"), doc.select(".text p")CSS 選擇器語法,極其靈活
內容清洗elements.select("font, script, a").remove()移除廣告標籤、腳本、超連結,保留純文本
實體轉義.html() 保留標籤 → replaceAll 處理將


轉換為真正換行

檔案寫入FileWriter(file, true) 追加模式避免大字串佔用記憶體,邊抓邊存
禮貌爬蟲Thread.sleep(100)降低請求頻率,尊重目標站點資源

進階擴展方向 (生產級爬蟲必備)

  1. 目錄頁自動解析:先抓目錄頁,提取所有章節 URL/標題,避免硬編碼 ID 範圍。
  2. 斷點續傳:記錄已下載章節 ID 到本地檔/資料庫,啟動時跳過。
  3. 多執行緒下載:ExecutorService + Semaphore 限流 (如 5 並發),大幅提速。
  4. 反反爬策略:隨機 User-Agent、代理 IP 池、Cookie 管理、驗證碼識別 (OCR/打碼平台)。
  5. 內容去重/品質評分:檢測章節字數異常、重複內容、廣告殘留。
  6. 輸出格式多樣化:EPUB (含目錄、封面)、MOBI、PDF、Markdown。
  7. 錯誤重試與熔斷:指數退避重試、連續失敗熔斷、告警通知。
  8. 合規性:遵守 robots.txt、網站服務條款、版權法,僅供個人學習研究使用。

常見問題 FAQ

Q: Jsoup 解析出來的中文亂碼?
A: 目標頁面編碼非 UTF-8。用 Jsoup.connect(url).charset("GBK").get() 指定編碼,或檢查 Response Header Content-Type。
Q: 選擇器 select() 找不到元素?
A: 瀏覽器 F12 檢查實際 DOM 結構,注意動態渲染 (JS 生成) Jsoup 無法執行,需改用 Selenium/Playwright。
Q: 下載幾十章就被封 IP?
A: 增加延遲 (1-3 秒)、使用代理 IP 池、模擬真實瀏覽器 Header (Referer, Accept-Language 等)。
Q: 內容包含大量 &nbsp;、&lt; 實體?
A: Jsoup .text() 會自動轉義,若需保留換行結構用 .html() 配合手動 replace。
Q: 大文件寫入記憶體溢出 (OOM)?
A: 必須使用「追加寫入」模式 (new FileWriter(file, true)),切勿在記憶體拼接全書字串。

總結

本文展示了「Jsoup + 追加寫入 + 禮貌延遲」的極簡爬蟲核心模式。幾十行代碼即可實現自動化下載,展現了 Java 生態處理網路資源的便利性。但請記住:技術無罪,用途有責。爬蟲僅供個人學習、離線閱讀使用,嚴禁商業化分發、大規模抓取影響他人服務、侵犯版權。願你在代碼世界裡自由遨遊,也尊重創作者的勞動成果。

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