女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實現Java多線程爬蟲的兩點

汽車玩家 ? 來源: 黑馬程序員 ? 作者: 黑馬程序員 ? 2020-05-05 21:25 ? 次閱讀

在我們調試爬蟲程序的時候,單線程爬蟲沒什么問題,但是當我們在線上環境使用單線程爬蟲程序去采集網頁時,單線程就暴露出了兩個致命的問題:

采集效率特別慢,單線程之間都是串行的,下一個執行動作需要等上一個執行完才能執行

對服務器的CUP等利用率不高,想想我們的服務器都是 8核16G,32G 的只跑一個線程會不會太浪費啦

線上環境不可能像我們本地測試一樣,不在乎采集效率,只要能正確提取結果就行。在這個時間就是金錢的年代,不可能給你時間去慢慢的采集,所以單線程爬蟲程序是行不通的,我們需要將單線程改成多線程的模式,來提升采集效率和提高計算機利用率。

多線程的爬蟲程序設計比單線程就要復雜很多,但是與其他業務在高并發下要保證數據安全又不同,多線程爬蟲在數據安全上到要求不是那么的高,因為每個頁面都可以被看作是一個獨立體。要做好多線程爬蟲就必須做好兩點:第一點就是統一的待采集 URL 維護,第二點就是 URL 的去重,下面我們簡單的來聊一聊這兩點。

維護待采集的 URL

多線程爬蟲程序就不能像單線程那樣,每個線程獨自維護這自己的待采集 URL,如果這樣的話,那么每個線程采集的網頁將是一樣的,你這就不是多線程采集啦,你這是將一個頁面采集的多次。基于這個原因我們就需要將待采集的 URL 統一維護,每個線程從統一 URL 維護處領取采集 URL ,完成采集任務,如果在頁面上發現新的 URL 鏈接則添加到 統一 URL 維護的容器中。下面是幾種適合用作統一 URL 維護的容器:

JDK 的安全隊列,例如 LinkedBlockingQueue

高性能的 NoSQL,比如 Redis、Mongodb

MQ 消息中間件

URL 的去重

URL 的去重也是多線程采集的關鍵一步,因為如果不去重的話,那么我們將采集到大量重復的 URL,這樣并沒有提升我們的采集效率,比如一個分頁的新聞列表,我們在采集第一頁的時候可以得到 2、3、4、5 頁的鏈接,在采集第二頁的時候又會得到 1、3、4、5 頁的鏈接,待采集的 URL 隊列中將存在大量的列表頁鏈接,這樣就會重復采集甚至進入到一個死循環當中,所以就需要 URL 去重。URL 去重的方法就非常多啦,下面是幾種常用的 URL 去重方式:

將 URL 保存到數據庫進行去重,比如 redis、MongoDB

將 URL 放到哈希表中去重,例如 hashset

將 URL 經過 MD5 之后保存到哈希表中去重,相比于上面一種,能夠節約空間

使用 布隆過濾器(Bloom Filter)去重,這種方式能夠節約大量的空間,就是不那么準確。

關于多線程爬蟲的兩個核心知識點我們都知道啦,下面我畫了一個簡單的多線程爬蟲架構圖,如下圖所示:

實現Java多線程爬蟲的兩點

多線程爬蟲架構圖

上面我們主要了解了多線程爬蟲的架構設計,接下來我們不妨來試試 Java 多線程爬蟲,我們以采集虎撲新聞為例來實戰一下 Java 多線程爬蟲,Java 多線程爬蟲中設計到了 待采集 URL 的維護和 URL 去重,由于我們這里只是演示,所以我們就使用 JDK 內置的容器來完成,我們使用 LinkedBlockingQueue 作為待采集 URL 維護容器,HashSet 作為 URL 去重容器。下面是 Java 多線程爬蟲核心代碼,詳細代碼以上傳 GitHub,地址在文末:

實現Java多線程爬蟲的兩點

實現Java多線程爬蟲的兩點

實現Java多線程爬蟲的兩點

我們用 5 個線程去采集虎撲新聞列表頁看看效果如果?運行該程序,得到如下結果:

實現Java多線程爬蟲的兩點

多線程采集結果

結果中可以看出,我們啟動了 5 個線程采集了 61 頁頁面,一共耗時 2 秒鐘,可以說效果還是不錯的,我們來跟單線程對比一下,看看差距有多大?我們將線程數設置為 1 ,再次啟動程序,得到如下結果:

實現Java多線程爬蟲的兩點

單線程運行結果

可以看出單線程采集虎撲 61 條新聞花費了 7 秒鐘,耗時差不多是多線程的 4 倍,你想想這可只是 61 個頁面,頁面更多的話,差距會越來越大,所以多線程爬蟲效率還是非常高的。

分布式爬蟲架構

分布式爬蟲架構是一個大型采集程序才需要使用的架構,一般情況下使用單機多線程就可以解決業務需求,反正我是沒有分布式爬蟲項目的經驗,所以這一塊我也沒什么可以講的,但是我們作為技術人員,我們需要對技術保存熱度,雖然不用,但是了解了解也無妨,我查閱了不少資料得出了如下結論:

分布式爬蟲架構跟我們多線程爬蟲架構在思路上來說是一樣的,我們只需要在多線程的基礎上稍加改進就可以變成一個簡單的分布式爬蟲架構。因為分布式爬蟲架構中爬蟲程序部署在不同的機器上,所以我們待采集的 URL 和 采集過的 URL 就不能存放在爬蟲程序機器的內存中啦,我們需要將它統一在某臺機器上維護啦,比如存放在 Redis 或者 MongoDB 中,每臺機器都從這上面獲取采集鏈接,而不是從 LinkedBlockingQueue 這樣的內存隊列中取鏈接啦,這樣一個簡單的分布式爬蟲架構就出現了,當然這里面還會有很多細節問題,因為我沒有分布式架構的經驗

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    2984

    瀏覽量

    106869
  • 多線程
    +關注

    關注

    0

    文章

    279

    瀏覽量

    20308
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    請問如何在Python中實現多線程與多進程的協作?

    大家好!我最近在開發一個Python項目時,需要同時處理多個任務,且每個任務需要不同的計算資源。我想通過多線程和多進程的組合來實現并發,但遇到了一些問題。 具體來說,我有個任務,一個是I/O密集型
    發表于 03-11 06:57

    請問rt-thread studio如何進行多線程編譯?

    ,使用的是5800h+32g內存+sn550 ssd,開啟16線程編譯時cpu的占用率也只能到30%,編譯完整個工程需要3分鐘 感覺多線程編譯設置沒有生效,有辦法提高編譯速度嗎
    發表于 02-19 08:30

    ADS1232信號輸入從零到滿度兩點變化,其數據建立過程需要次到三次轉換,為什么?

    ADS1232信號輸入從零到滿度兩點變化(用的是信號模擬器),發現其數據建立過程需要次到三次轉換,也就是200ms到300msAD值才能從零跳到滿度。分析有三個原因: 1.信號
    發表于 01-10 08:02

    IP地址數據信息和爬蟲攔截的關聯

    IP地址數據信息和爬蟲攔截的關聯主要涉及到方面的內容,也就是數據信息和爬蟲。IP 地址數據信息的內容豐富,包括所屬地域、所屬網絡運營商、訪問時間序列、訪問頻率等。 從IP地址信息中可以窺見
    的頭像 發表于 12-23 10:13 ?303次閱讀

    socket 多線程編程實現方法

    在現代網絡編程中,多線程技術被廣泛應用于提高服務器的并發處理能力。Socket編程是網絡通信的基礎,而將多線程技術應用于Socket編程,可以顯著提升服務器的性能。 多線程編程的基本概念 多線
    的頭像 發表于 11-12 14:16 ?890次閱讀

    Python中多線程和多進程的區別

    Python作為一種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的種方式之一。在本文中,我們將探討Python中多線程與多進程的概念、區別以及如何使用線程池與進
    的頭像 發表于 10-23 11:48 ?913次閱讀
    Python中<b class='flag-5'>多線程</b>和多進程的區別

    CPU線程和程序線程的區別

    CPU的線程與程序的線程在概念、作用、實現方式以及性能影響等方面存在顯著差異。以下是對者區別的詳細闡述,旨在深入探討這一技術話題。
    的頭像 發表于 09-02 11:18 ?1919次閱讀

    INA818輸入直接取電阻R2兩點電壓,兩點壓差范圍約為2mV~200mV,是否可以直接作為INA818的輸入呢?

    : 1.INA818采用5V單電源供電,REF引腳由DAC芯片給出2.5V的參考電壓。 2.INA818的輸入直接取電阻R2兩點電壓,兩點壓差范圍約為2mV~200mV,這是否可以直接作為INA818的輸入呢
    發表于 08-09 06:29

    一文掌握Python多線程

    使用線程可以把占據長時間的程序中的任務放到后臺去處理。
    的頭像 發表于 08-05 15:46 ?1187次閱讀

    LWIP多線程強烈建議開啟LWIP_ASSERT_CORE_LOCKED宏,這個在RTT里面要怎么實現

    LWIP多線程強烈建議開啟LWIP_ASSERT_CORE_LOCKED宏,這個在RTT里面要怎么實現,之前參考網上代碼,這樣寫,壓力測試下有概率斷言失敗 extern sys_mutex_t
    發表于 07-25 06:27

    ESP32會不會有多線程問題,需要加鎖嗎?

    ESP32會不會有多線程問題,需要加鎖嗎
    發表于 07-19 08:05

    華納云:java web和java有什么區別java web和java有什么區別

    Java Web和Java個不同的概念,它們在功能、用途和實現方式上存在一些區別,下面將詳細介紹它們之間的區別。 1. 功能和用途: – Jav
    的頭像 發表于 07-16 13:35 ?1362次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別

    多線程設計模式到對 CompletableFuture 的應用

    最近在開發 延保服務 頻道頁時,為了提高查詢效率,使用到了多線程技術。為了對多線程方案設計有更加充分的了解,在業余時間讀完了《圖解 Java 多線程設計模式》這本書,覺得收獲良多。本篇
    的頭像 發表于 06-26 14:18 ?613次閱讀
    從<b class='flag-5'>多線程</b>設計模式到對 CompletableFuture 的應用

    探索虛擬線程:原理與實現

    虛擬線程的引入與優勢 在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現的,這些
    的頭像 發表于 06-24 11:35 ?527次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與<b class='flag-5'>實現</b>

    動態線程池思想學習及實踐

    ://www.javadoop.com/post/java-thread-pool? 引言 在后臺項目開發過程中,我們常常借助線程池來實現多線程任務,以此提升系統的吞吐率和響應性;而
    的頭像 發表于 06-13 15:43 ?1476次閱讀
    動態<b class='flag-5'>線程</b>池思想學習及實踐