在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

實現(xiàn)Java多線程爬蟲的兩點

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

在我們調(diào)試爬蟲程序的時候,單線程爬蟲沒什么問題,但是當(dāng)我們在線上環(huán)境使用單線程爬蟲程序去采集網(wǎng)頁時,單線程就暴露出了兩個致命的問題:

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

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

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

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

維護待采集的 URL

多線程爬蟲程序就不能像單線程那樣,每個線程獨自維護這自己的待采集 URL,如果這樣的話,那么每個線程采集的網(wǎng)頁將是一樣的,你這就不是多線程采集啦,你這是將一個頁面采集的多次?;谶@個原因我們就需要將待采集的 URL 統(tǒng)一維護,每個線程從統(tǒng)一 URL 維護處領(lǐng)取采集 URL ,完成采集任務(wù),如果在頁面上發(fā)現(xiàn)新的 URL 鏈接則添加到 統(tǒng)一 URL 維護的容器中。下面是幾種適合用作統(tǒng)一 URL 維護的容器:

JDK 的安全隊列,例如 LinkedBlockingQueue

高性能的 NoSQL,比如 Redis、Mongodb

MQ 消息中間件

URL 的去重

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

將 URL 保存到數(shù)據(jù)庫進行去重,比如 redis、MongoDB

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

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

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

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

實現(xiàn)Java多線程爬蟲的兩點

多線程爬蟲架構(gòu)圖

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

實現(xiàn)Java多線程爬蟲的兩點

實現(xiàn)Java多線程爬蟲的兩點

實現(xiàn)Java多線程爬蟲的兩點

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

實現(xiàn)Java多線程爬蟲的兩點

多線程采集結(jié)果

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

實現(xiàn)Java多線程爬蟲的兩點

單線程運行結(jié)果

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

分布式爬蟲架構(gòu)

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2971

    瀏覽量

    104848
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    20016
收藏 人收藏

    評論

    相關(guān)推薦

    socket 多線程編程實現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket編程,可以顯著提升服務(wù)器的性能。 多線程編程的基本概念 多線
    的頭像 發(fā)表于 11-12 14:16 ?397次閱讀

    Python中多線程和多進程的區(qū)別

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

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

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

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

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

    多線程設(shè)計模式到對 CompletableFuture 的應(yīng)用

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

    探索虛擬線程:原理與實現(xiàn)

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

    動態(tài)線程池思想學(xué)習(xí)及實踐

    ://www.javadoop.com/post/java-thread-pool? 引言 在后臺項目開發(fā)過程中,我們常常借助線程池來實現(xiàn)多線程任務(wù),以此提升系統(tǒng)的吞吐率和響應(yīng)性;而
    的頭像 發(fā)表于 06-13 15:43 ?1200次閱讀
    動態(tài)<b class='flag-5'>線程</b>池思想學(xué)習(xí)及實踐

    bootloader開多線程做引導(dǎo)程序,跳app初始化后直接進hardfualt,為什么?

    如標(biāo)題,想做一個遠程升級的項目,bootloader引導(dǎo)區(qū)域和app都是開多線程跑的,就是自己寫了個小的任務(wù)調(diào)度器,沒什么功能主要是想讓程序快速的響應(yīng),延時不會對其他程序造成堵塞,程序測試
    發(fā)表于 04-18 06:07

    鴻蒙OS開發(fā)實例:【ArkTS類庫多線程CPU密集型任務(wù)TaskPool】

    CPU密集型任務(wù)是指需要占用系統(tǒng)資源處理大量計算能力的任務(wù),需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像處理、視頻編碼、數(shù)據(jù)分析等。 基于多線程并發(fā)機制處理CPU密集型任務(wù)可以提高CPU
    的頭像 發(fā)表于 04-01 22:25 ?857次閱讀
    鴻蒙OS開發(fā)實例:【ArkTS類庫<b class='flag-5'>多線程</b>CPU密集型任務(wù)TaskPool】

    鴻蒙APP開發(fā):【ArkTS類庫多線程】TaskPool和Worker的對比

    TaskPool(任務(wù)池)和Worker的作用是為應(yīng)用程序提供一個多線程的運行環(huán)境,用于處理耗時的計算任務(wù)或其他密集型任務(wù)??梢杂行У乇苊膺@些任務(wù)阻塞主線程,從而最大化系統(tǒng)的利用率,降低整體資源消耗,并提高系統(tǒng)的整體性能。
    的頭像 發(fā)表于 03-26 22:09 ?661次閱讀
    鴻蒙APP開發(fā):【ArkTS類庫<b class='flag-5'>多線程</b>】TaskPool和Worker的對比

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫多線程TaskPool和Worker的對比(一)

    TaskPool(任務(wù)池)和Worker的作用是為應(yīng)用程序提供一個多線程的運行環(huán)境,用于處理耗時的計算任務(wù)或其他密集型任務(wù)??梢杂行У乇苊膺@些任務(wù)阻塞主線程,從而最大化系統(tǒng)的利用率,降低整體資源消耗
    發(fā)表于 03-25 14:11

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫多線程I/O密集型任務(wù)開發(fā)

    使用異步并發(fā)可以解決單次I/O任務(wù)阻塞的問題,但是如果遇到I/O密集型任務(wù),同樣會阻塞線程中其它任務(wù)的執(zhí)行,這時需要使用多線程并發(fā)能力來進行解決。 I/O密集型任務(wù)的性能重點通常不在于CPU的處理
    發(fā)表于 03-21 14:57

    java實現(xiàn)多線程的幾種方式

    Java實現(xiàn)多線程的幾種方式 多線程是指程序中包含了個或以上的線程,每個
    的頭像 發(fā)表于 03-14 16:55 ?737次閱讀

    AT socket可以多線程調(diào)用嗎?

    請問AT socket 可以多線程調(diào)用嗎? 有互鎖機制嗎,還是要自己做互鎖。
    發(fā)表于 03-01 08:22

    linux多線程編程實例

    linux線程
    的頭像 發(fā)表于 02-15 21:16 ?484次閱讀
    linux<b class='flag-5'>多線程</b>編程實例
    主站蜘蛛池模板: 中文字幕在线一区二区在线 | 亚洲播放| 超人碰碰碰人人成碰人| 黄色www网站| 5151hh四虎国产精品| 黄色在线播放网站| 亚洲第一区在线| 99热精品一区| 天堂网2021天堂手机版| 日鲁夜鲁鲁狠狠综合视频| 欧美白人极品性喷潮| 国产主播在线播放| 99国产精品农村一级毛片| 午夜免费啪在线观看视频网站| 色花堂国产精品首页第一页| 国产未成女年一区二区| xxxx性欧美高清| www三级| 四虎影视免费看| 久久婷婷国产一区二区三区| 99视频网址| 加勒比在线一区| rrr523亚洲国产片| 亚洲已满18点击进入在线观看| 日韩一级片在线观看| 狠狠色丁香久久综合五月| 在线capcom超级碰碰| 久久99精品福利久久久| 一区二区三区四区在线免费观看| 曰韩一级| 欧美人成在线观看| 99色婷婷| 94久久国产乱子伦精品免费| 美女写真福利视频| 色偷偷88欧美精品久久久| 好男人午夜| 色视频综合| 在线a亚洲老鸭窝天堂新地址| 亚欧美色| 狠狠色丁香婷婷综合最新地址| 天堂在线中文|