99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

汽車玩家 ? 來(lái)源: 黑馬程序員 ? 作者: 黑馬程序員 ? 2020-05-05 21:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

維護(hù)待采集的 URL

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

JDK 的安全隊(duì)列,例如 LinkedBlockingQueue

高性能的 NoSQL,比如 Redis、Mongodb

MQ 消息中間件

URL 的去重

URL 的去重也是多線程采集的關(guān)鍵一步,因?yàn)槿绻蝗ブ氐脑挘敲次覀儗⒉杉酱罅恐貜?fù)的 URL,這樣并沒有提升我們的采集效率,比如一個(gè)分頁(yè)的新聞列表,我們?cè)诓杉谝豁?yè)的時(shí)候可以得到 2、3、4、5 頁(yè)的鏈接,在采集第二頁(yè)的時(shí)候又會(huì)得到 1、3、4、5 頁(yè)的鏈接,待采集的 URL 隊(duì)列中將存在大量的列表頁(yè)鏈接,這樣就會(huì)重復(fù)采集甚至進(jìn)入到一個(gè)死循環(huán)當(dāng)中,所以就需要 URL 去重。URL 去重的方法就非常多啦,下面是幾種常用的 URL 去重方式:

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

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

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

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

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

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

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

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

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

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

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

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

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

多線程采集結(jié)果

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

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

單線程運(yùn)行結(jié)果

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

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

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

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

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

    關(guān)注

    20

    文章

    2989

    瀏覽量

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

    關(guān)注

    0

    文章

    279

    瀏覽量

    20445
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    多線程的安全注意事項(xiàng)

    多線程安全是指多個(gè)線程同時(shí)訪問或修改共享資源時(shí),能夠保證程序的正確性和可靠性。 開發(fā)者選擇TaskPool或Worker進(jìn)行多線程開發(fā)時(shí),在TaskPool和Worker的工作線程中導(dǎo)
    發(fā)表于 06-20 07:49

    工控一體機(jī)多線程任務(wù)調(diào)度優(yōu)化:聚徽分享破解工業(yè)復(fù)雜流程高效協(xié)同密碼

    在當(dāng)今工業(yè) 4.0 的浪潮下,工業(yè)生產(chǎn)正朝著高度自動(dòng)化、智能化的方向大步邁進(jìn)。生產(chǎn)流程日益復(fù)雜,眾多任務(wù)需要同時(shí)、高效地協(xié)同執(zhí)行,這對(duì)工業(yè)控制系統(tǒng)的核心 —— 工控一體機(jī)提出了前所未有的挑戰(zhàn)。多線程
    的頭像 發(fā)表于 05-28 14:06 ?171次閱讀

    一種實(shí)時(shí)多線程VSLAM框架vS-Graphs介紹

    針對(duì)現(xiàn)有VSLAM系統(tǒng)語(yǔ)義表達(dá)不足、地圖可解釋性差的問題,本文提出vS-Graphs,一種實(shí)時(shí)多線程VSLAM框架。該方案顯著提升了重建地圖的語(yǔ)義豐富度、可解釋性及定位精度。實(shí)驗(yàn)表明
    的頭像 發(fā)表于 04-19 14:07 ?397次閱讀
    一種實(shí)時(shí)<b class='flag-5'>多線程</b>VSLAM框架vS-Graphs介紹

    請(qǐng)問如何在Python中實(shí)現(xiàn)多線程與多進(jìn)程的協(xié)作?

    大家好!我最近在開發(fā)一個(gè)Python項(xiàng)目時(shí),需要同時(shí)處理多個(gè)任務(wù),且每個(gè)任務(wù)需要不同的計(jì)算資源。我想通過多線程和多進(jìn)程的組合來(lái)實(shí)現(xiàn)并發(fā),但遇到了一些問題。 具體來(lái)說(shuō),我有個(gè)任務(wù),一個(gè)是I/O密集型
    發(fā)表于 03-11 06:57

    請(qǐng)問rt-thread studio如何進(jìn)行多線程編譯?

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

    ADS1232信號(hào)輸入從零點(diǎn)到滿度兩點(diǎn)變化,其數(shù)據(jù)建立過程需要次到三次轉(zhuǎn)換,為什么?

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

    IP地址數(shù)據(jù)信息和爬蟲攔截的關(guān)聯(lián)

    IP地址數(shù)據(jù)信息和爬蟲攔截的關(guān)聯(lián)主要涉及到方面的內(nèi)容,也就是數(shù)據(jù)信息和爬蟲。IP 地址數(shù)據(jù)信息的內(nèi)容豐富,包括所屬地域、所屬網(wǎng)絡(luò)運(yùn)營(yíng)商、訪問時(shí)間序列、訪問頻率等。 從IP地址信息中可以窺見
    的頭像 發(fā)表于 12-23 10:13 ?384次閱讀

    socket 多線程編程實(shí)現(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 ?1016次閱讀

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

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

    CPU線程和程序線程的區(qū)別

    CPU的線程與程序的線程在概念、作用、實(shí)現(xiàn)方式以及性能影響等方面存在顯著差異。以下是對(duì)者區(qū)別的詳細(xì)闡述,旨在深入探討這一技術(shù)話題。
    的頭像 發(fā)表于 09-02 11:18 ?2132次閱讀

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

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

    一文掌握Python多線程

    使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理。
    的頭像 發(fā)表于 08-05 15:46 ?1266次閱讀

    Java CompletableFuture 異步超時(shí)實(shí)現(xiàn)探索

    用手段便是多線程并行執(zhí)行。這時(shí)候就會(huì)涉及到 CompletableFuture 的使用。 常見使用方式 下面舉例一個(gè)常見場(chǎng)景。
    的頭像 發(fā)表于 07-25 14:06 ?670次閱讀

    LWIP多線程強(qiáng)烈建議開啟LWIP_ASSERT_CORE_LOCKED宏,這個(gè)在RTT里面要怎么實(shí)現(xiàn)

    LWIP多線程強(qiáng)烈建議開啟LWIP_ASSERT_CORE_LOCKED宏,這個(gè)在RTT里面要怎么實(shí)現(xiàn),之前參考網(wǎng)上代碼,這樣寫,壓力測(cè)試下有概率斷言失敗 extern sys_mutex_t
    發(fā)表于 07-25 06:27

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

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