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

Java 爬蟲實戰:基於 Jsoup 深度採集 CSDN 博客文章完整教程

     編輯:Java 相關知識

前言

本文通過實戰項目,演示如何使用 Jsoup 庫構建高效的 CSDN 博客文章爬蟲,涵蓋從單頁採集到全站分頁採集的完整流程,包含反爬應對、代理配置、數據解析與持久化等工程化實踐。

技術棧與前置技能

  • 核心庫:Jsoup 1.10.2+ (HTML 解析、CSS 選擇器、DOM 操作)
  • 構建工具:Maven / 手動導入 JAR
  • 前置技能:Java 基礎、正則表達式、jQuery/CSS 選擇器、HTTP 協議基礎
  • 調試工具:IDE (IntelliJ/Eclipse)、瀏覽器開發者工具 (Firebug/Chrome DevTools)

Maven 依賴配置

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

CSDN 博客頁面結構分析

以博主「郭霖」(guolin_blog) 為例,通過開發者工具分析:

  • 文章列表容器:div#article_list.list
  • 單篇文章結構:div.list_item.article_item
    • 標題鏈接:div.article_title h1 span.link_title a
    • 摘要:div.article_description
    • 元信息:div.article_manage span.link_postdate (時間)、span.link_view (閱讀數)、span.link_comments (評論數)
  • 分頁容器:div#papelist.pagelist
    • 總頁數文本:span:eq(0) → "100條 共7頁"

核心採集邏輯實現

數據模型

public class Article {
    private String address; // 相對鏈接
    private String title;
    private String description;
    private String time;
    // Getter/Setter 省略
}

單頁採集核心代碼

public List<Article> getArticlesByPage(int pageNum) throws IOException {
    String url = "https://blog.csdn.net/guolin_blog/article/list/" + pageNum;
    Connection conn = Jsoup.connect(url)
        .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
        .timeout(5000)
        .method(Connection.Method.GET);

    Document doc = conn.get();
    Element body = doc.body();

    Element articleListDiv = body.getElementById("article_list");
    Elements articleItems = articleListDiv.getElementsByClass("list_item");

    List<Article> result = new ArrayList<>();
    for (Element item : articleItems) {
        Article article = new Article();
        Element linkEl = item.select("div.article_title h1 a").first();
        Element descEl = item.getElementsByClass("article_description").first();
        Element metaEl = item.getElementsByClass("article_manage").first();

        article.setAddress(linkEl.attr("href"));
        article.setTitle(linkEl.text());
        article.setDescription(descEl.text());
        article.setTime(metaEl.select("span:eq(0)").text()); // 發布時間

        result.add(article);
    }
    return result;
}

全站分頁採集策略

public List<Article> crawlAllArticles() throws IOException {
    // 1. 獲取首頁確定總頁數
    Document firstPage = Jsoup.connect("https://blog.csdn.net/guolin_blog")
        .userAgent(UA).timeout(5000).get();
    
    String pageInfo = firstPage.getElementById("papelist")
        .select("span:eq(0)").text(); // "100條 共7頁"
    
    // 2. 正則提取總頁數
    int totalPages = Integer.parseInt(
        pageInfo.replaceAll(".+共(\\d+)頁", "$1")
    );

    // 3. 逐頁採集聚合
    List<Article> allArticles = new ArrayList<>();
    for (int i = 1; i <= totalPages; i++) {
        allArticles.addAll(getArticlesByPage(i));
        // 禮貌延遲,避免觸發反爬
        Thread.sleep(1000 + new Random().nextInt(2000));
    }
    return allArticles;
}

關鍵工程化細節

1. 超時設置合理化

  • 連接超時 timeout(5000) (5秒),過短導致 SocketTimeoutException
  • 根據目標站點響應速度動態調整

2. 代理配置 (企業內網/受限環境)

System.setProperty("http.maxRedirects", "50");
System.getProperties().setProperty("proxySet", "true");
System.getProperties().setProperty("http.proxyHost", "代理IP");
System.getProperties().setProperty("http.proxyPort", "代理端口");
// 若需認證
Authenticator.setDefault(new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("user", "pass".toCharArray());
    }
});

3. 反爬應對策略

  • 設置真實 User-Agent,模擬瀏覽器指紋
  • 請求間隔隨機延遲 (1-3秒)
  • 會話保持:復用 Connection 對象保持 Cookie
  • 異常重試機制:指數退避重試 3 次
  • IP 池輪換 (大規模採集必備)

4. 數據持久化擴展

  • MySQL/JDBC 批量入庫
  • Elasticsearch 全文檢索
  • JSON/CSV 文件導出

完整項目結構

csdn-crawler/
├── src/main/java/
│   ├── model/Article.java
│   ├── crawler/CsdnCrawler.java
│   └── util/RegexUtils.java
├── pom.xml
└── README.md

法律與道德邊界

重要提醒:爬蟲開發必須遵守:

  1. robots.txt 協議
  2. 網站服務條款 (ToS)
  3. 《計算機信息網絡國際聯網管理暫行規定》等法律法規
  4. 控制採集頻率,不影響目標站點正常服務
  5. 僅採集公開數據,不繞過登錄/驗證機制

總結

Jsoup 以其鏈式 API、CSS 選擇器、容錯解析能力,成為 Java 爬蟲開發的首選工具。本文從頁面分析、單頁解析、分頁策略、反爬應對到工程化落地,提供了完整的 CSDN 博客採集實戰指南。代碼已開源托管,歡迎技術交流共同進步。

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