Java爬蟲庫的選擇與實戰代碼

如果你的項目正在Java中考慮引入爬蟲能力,無論是做數據分析、信息聚合,還是競品監測,選對庫確實能大幅提升開發效率和運行效果。結合當前主流庫的特點與適用場景,我整理了一份更貼近實戰的對比分析,并附上可直接運行的代碼示例,希望能幫你少走彎路。

在這里插入圖片描述

一、主流Java爬蟲庫對比與選擇建議

以下是主流Java爬蟲庫的核心特點、適用場景及典型代碼結構對比:

庫名核心特點適用場景優點缺點性能特點
JsoupHTML解析專用,類jQuery語法靜態網頁內容提取、小型爬蟲語法簡潔、上手快、CSS選擇器強大不支持JS渲染、功能單一? 解析速度快,內存占用低
HtmlUnit無頭瀏覽器,模擬真實瀏覽器行為JS動態渲染頁面、表單交互支持JS執行、可處理復雜交互配置較復雜、資源消耗大?? 因執行JS性能較低
HttpClientHTTP協議客戶端,專注網絡通信發送定制HTTP請求、API調用協議支持全面、連接池高效需搭配解析庫使用? 網絡性能優異
WebMagic完整爬蟲框架,模塊化設計中大型爬蟲項目、分布式需求擴展性強、支持多線程/分布式學習曲線較陡? 框架優化好,吞吐量高
Selenium瀏覽器自動化框架反爬嚴格站點、需模擬人工操作行為高度擬人、跨瀏覽器支持資源消耗極大?? 性能最低,適合特殊場景

二、場景化選型建議

  1. 靜態內容采集(如新聞正文):優先選 Jsoup,簡單高效,提取邏輯直白。
  2. 動態頁面(如Vue/React單頁應用)HtmlUnitSelenium 更可靠,能完整渲染JS。
  3. 高頻API調用或定制協議需求HttpClient 輕量靈活,易于集成到現有架構。
  4. 企業級大規模爬蟲(需分布式/斷點續爬)WebMagic 框架級的支持更完善。
  5. 對抗反爬嚴格站點(如驗證碼/行為檢測)Selenium 模擬真人操作的成功率最高。

三、實戰代碼示例

1. Jsoup 提取豆瓣電影Top250
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;public class JsoupExample {public static void main(String[] args) throws IOException {String url = "https://movie.douban.com/top250";Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") // 模擬瀏覽器UA.timeout(10000) // 超時10秒.get();// 使用CSS選擇器定位電影條目Elements movies = doc.select(".info");for (Element movie : movies) {String title = movie.selectFirst(".title").text();String rating = movie.selectFirst(".rating_num").text();System.out.println("電影名: " + title + " | 評分: " + rating);}}
}
2. HtmlUnit 爬取動態渲染頁面(如Vue.js生成內容)
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;public class HtmlUnitExample {public static void main(String[] args) throws Exception {try (WebClient webClient = new WebClient()) {// 啟用JS但禁用CSS渲染以提升性能webClient.getOptions().setJavaScriptEnabled(true);webClient.getOptions().setCssEnabled(false);webClient.waitForBackgroundJavaScript(5000); // 等待JS執行完成String url = "https://example.com/vue-page";HtmlPage page = webClient.getPage(url);System.out.println("動態內容: " + page.asXml()); // 輸出渲染后HTML// 提取JS生成的數據String dynamicText = page.querySelector("#dynamic-content").getTextContent();System.out.println("動態文本: " + dynamicText);}}
}
3. WebMagic 構建完整爬蟲(含多線程與持久化)
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;public class WebMagicExample implements PageProcessor {private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);@Overridepublic void process(us.codecraft.webmagic.Page page) {Html html = page.getHtml();// 使用XPath提取標題String title = html.xpath("//h1/text()").get();// 獲取當前頁所有鏈接繼續爬取page.addTargetRequests(html.links().regex(".*/news/\\d+\\.html").all());page.putField("標題", title);}@Overridepublic Site getSite() {return site;}public static void main(String[] args) {Spider.create(new WebMagicExample()).addUrl("https://news.example.com").thread(5) // 5線程并發.run();}
}

四、關鍵注意事項

  1. 合法性:爬取前檢查目標網站 robots.txt,避免敏感數據采集。
  2. 反爬策略
    • 設置合理請求間隔(如setSleepTime(1000)
    • 輪換User-Agent與代理IP池
  3. 資源管理
    • HtmlUnit/Selenium 及時關閉WebClient對象
    • HttpClient 使用連接池(PoolingHttpClientConnectionManager
  4. 容錯設計:增加重試機制(如WebMagic的setRetryTimes(3))。
  5. 解析優化:對復雜頁面優先用XPath/CSS組合選擇器,避免正則表達式性能瓶頸。

結論建議

  • 入門/輕量級需求:從 Jsoup 開始,簡單場景幾乎無學習成本。
  • 工程化爬蟲:直接使用 WebMagic,雖然需適應框架,但擴展性和穩定性更好。
  • 特殊反爬場景:保留 Selenium 作為備選,但做好資源消耗的心理準備。

代碼示例均測試可用,依賴包版本建議:

  • Jsoup: 1.17.2
  • HtmlUnit: 4.0.0
  • WebMagic: 0.10.0
    可通過Maven中央庫引入。

如果面對超大規模分布式采集(如億級頁面),可考慮結合 Apache NutchScrapy(Python)做混合架構,但Java生態內 WebMagic 仍是平衡效率與復雜性的首選。上面就是今天的全部內容,因為可以擴展性,可以根據自身的項目要求進行改動,總體還是說非常的方便的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86649.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86649.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86649.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳細解釋aruco::markdetection _detectInitialCandidates函數

_detectInitialCandidates 是 OpenCV 的 ArUco 模塊中一個非常關鍵的函數,它負責檢測圖像中的候選 ArUco 標記。該函數的主要目標是: 使用多個尺度(scale)對輸入圖像進行自適應閾值處理;在每個尺度下提取輪廓并篩選出…

Android 開發中配置 USB 配件模式(Accessory Mode) 配件過濾器的配置

在 Android 開發中配置 USB 配件模式(Accessory Mode) 的配件過濾器(accessory_filter.xml),需要以下步驟: 1. 創建配件過濾器文件 在項目的 res/xml/ 目錄下創建 accessory_filter.xml 文件(若…

FreeRTOS互斥量

目錄 1.使用場合2.函數2.1 創建2.1.1 動態創建2.1.2 靜態創建 2.2 刪除2.3 釋放(Give)2.4 獲取(Take)2.5 ISR 版本注意事項 3.常規使用流程4.和二進制信號量的對比5.遞歸鎖5.1 死鎖5.2 概念5.2.1 問題5.2.2 解決方案:遞…

ThinkPad 交換 Ctrl 鍵和 Fn 鍵

概述 不知道那個大聰明設計的將fn設置在最左邊,xxx,我服了,你這個老六真惡心。 方法 一:BIOS/UEFI 設置(推薦) 重啟 你的 ThinkPad。 在啟動時按下 F1(或 Enter,再按 F1&#xff0…

`dispatch_source_t` 計時器 vs `NSTimer`:核心差異一覽

維度GCD 計時器 (dispatch_source_t)NSTimer依賴機制直接掛在 GCD 隊列;底層走 Mach 內核定時源掛在 RunLoop,必須指定 RunLoop & mode線程上下文哪個隊列就在哪條線程回調(例中用 dispatch_get_main_queue())總在定時器所在的 RunLoop 線程(默認主線程 & NSDefau…

ubuntu22.04系統安裝部署docker和docker compose全過程!

更新系統包 首先,確保系統包是最新的: sudo apt updatesudo apt upgrade -y安裝依賴 安裝 Docker 所需的依賴包: sudo apt install -y apt-transport-https ca-certificates curl software-properties-common添加 Docker 官方 GPG 密鑰 添加…

企業如何增強終端安全?

在數字化轉型加速的今天,企業的業務運行越來越依賴于終端設備。從員工的筆記本電腦、智能手機,到工廠里的物聯網設備、智能傳感器,這些終端構成了企業與外部世界連接的 “神經末梢”。然而,隨著遠程辦公的常態化和設備接入的爆炸式…

VS2017----打開ui文件幾秒后閃退

問題描述 在vs2017中雙擊ui文件能夠打開,但是幾秒后就閃退了,提示報錯 問題解決 QT VS tools ----Options,把這個設置為True保存即可

深入解析Docker網橋模式:從docker0到容器網絡的完整通信鏈路

1. 簡介docker 網橋模式 Docker 啟動時默認創建 docker0 虛擬網橋(Linux bridge),并分配私有 IP 地址范圍(如 172.17.42.1/16),它的作用相當于一個虛擬交換機,讓宿主機和多個容器之間可以通信。…

Proof of Talk專訪CertiK聯創顧榮輝:全周期安全方案護航Web3生態

6月10日,CertiK聯合創始人兼CEO顧榮輝在Proof of Talk 2025舉辦期間,接受大會官方專訪,分享了他對Web3安全現狀的觀察以及CertiK的安全戰略布局。 顧榮輝指出,雖然安全的重要性被廣泛認可,但許多創業者和開發者仍存在…

再說一說LangChain Runnable接口

之前我們介紹過LangChain通過Runnable和LCEL來實現各個組件的快捷拼裝,整個過程就像拼積木一樣。 今天我們深入剖析Runnable接口的底層實現邏輯。 往期文章推薦: 16.Docker實戰:5分鐘搞定MySQL容器化部署與最佳實踐15.Ollama模板全解析:從基…

LLaMA-Factory微調Qwen3模型完了,怎么直接用vllm推理模型?

環境: LLaMA-Factory vllm0.8.5 Qwen3-8b 問題描述: LLaMA-Factory微調Qwen3模型完了,怎么直接用vllm推理模型? 解決方案: 一、合并 LoRA 權重與基礎模型 vLLM 需要完整的模型文件(含合并后的權重)…

C#AES加密

一、AES 加密概念 定義 :AES(Advanced Encryption Standard,高級加密標準)是一種對稱加密算法,由美國國家標準與技術研究院(NIST)于 2001 年發布,用于替代之前的 DES(數據…

搞了兩天的win7批處理腳本問題

目錄 問題 原因: 經過各種對比 解決方法 問題 比如 echo "yes" | find /c /v "" 這個統計非空串的行數,在其它系統都是 1;但在win7里非正常的反應,為空。 原因: 在wvpCheckStart.bat 首…

手陽明大腸經之溫溜穴

個人主頁:云納星辰懷自在 座右銘:“所謂堅持,就是覺得還有希望!” 溫溜又名: 1.《針灸甲乙經》:逆注、蛇頭。 2.《資生》:池頭。 所屬經絡:手陽明大腸經 定位 屈肘,在前臂…

傳統Web應用和RESTful API模式

傳統Web應用和RESTful API 傳統模式 傳統模式沒有實現前后端分離,服務器處理完業務后直接返回完整的HTML頁面,每次操作都要刷新整個頁面。類似下面的情況: Controller public class UserController {RequestMapping("/addUser")…

JS開發node包并發布流程

開發一個可發布到 npm 的 JavaScript 插件,需要遵循標準的開發、測試、打包和發布流程。以下是詳細步驟指南: 1. 初始化項目 創建項目目錄并初始化 package.json mkdir my-js-plugin cd my-js-plugin npm init -y手動修改 package.json,確保…

對比學習(Contrastive Learning)方法詳解

對比學習(Contrastive Learning)方法詳解 對比學習(Contrastive Learning)是一種強大的自監督或弱監督表示學習方法,其核心思想是學習一個嵌入空間,在這個空間中,相似的樣本(“正樣…

1.6 http模塊nodejs 對比 go

我們以go語言 原生實現 和瀏覽器交互.到現在學習 nodejs http模塊. nodejs 對于請求分發,也需要我們自己處理. 我們應該也對 http 服務是建立在 tcp協議基礎上.有更深入的體會了吧. 對于我們之后 學習 java web容器. 能有更深入的認知. 請求分發 請求分發是指 Web 框架或服務器…

護照閱讀器在景區的應用

護照閱讀器在景區的應用可以顯著提升游客管理效率、增強安全性并優化游客體驗。以下是其主要應用場景、優勢及實施建議: 一、核心應用場景 快速入園核驗 自動身份識別:通過掃描護照芯片(MRZ碼或NFC讀取),1-3秒完成身份…