首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 爬蟲實戰:使用 Jsoup 提取網頁版權信息

     編輯:程式設計疑難解答

需求

從網頁 HTML 中提取版權聲明(如「版權所有 © 2024 XXX」),論文提到用 11 種正則,實際上**現代 HTML 解析器 + 選擇器**遠比正則健壯。

推薦方案:Jsoup 一行搞定

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.17.2</version>
</dependency>
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public static void main(String[] args) throws IOException {
    // 1. 獲取文檔
    Document doc = Jsoup.connect("https://www.ccopyright.com.cn/cpcc/index.jsp")
                        .timeout(10000)
                        .get();

    // 2. 選擇包含關鍵字的元素(支援 CSS 選擇器、XPath 風格)
    Elements copyrightElements = doc.select(":containsOwn(版權所有)"); 
    // 或更精確:doc.select("footer, .copyright, [class*=copyright], [id*=copyright]")

    // 3. 提取純文本
    for (Element el : copyrightElements) {
        String text = el.text(); // 自動去除標簽,合併文本節點
        System.out.println(text);
    }
}

為何不建議手寫正則?

正則痛點Jsoup 優勢
HTML 結構變動(換行、屬性順序、巢狀)導致失效DOM 模型穩定,選擇器針對語義結構
編碼實體 (`©`, `©`) 需手動解碼自動解碼實體,輸出可讀文本
跨標簽文本(`版權`)難匹配`.text()` 自動遞歸提取所有後代文本
惡意/畸形 HTML 導致災難性回溯容錯解析器,類似瀏覽器容錯能力

進階:多站點通用提取策略

// 常見版權區域選擇器組合
String selector = "footer, " +
                  ".copyright, .copy-right, .footer-copyright, " +
                  "[class*=copyright], [id*=copyright], " +
                  "meta[name=copyright], " +
                  "small:contains(©), small:contains(版權)";

Elements els = doc.select(selector);
String copyright = els.stream()
        .map(Element::text)
        .filter(s -> s.length() > 5)
        .findFirst()
        .orElse("未找到");

法律與工程提醒

  • 遵守 `robots.txt`、爬蟲頻率限制、網站服務條款。
  • 版權信息屬事實數據,通常可合理使用,但全站鏡像需授權。
  • 生產環境加入緩存、去重、異常重試、代理池。

**拋棄脆弱正則,擁抱 Jsoup/HtmlUnit/Playwright 等結構化解析器,才是爬蟲正道。**

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