大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java多線程爬蟲及分布式爬蟲架構(gòu)

Java多線程爬蟲及分布式爬蟲架構(gòu)

更新時(shí)間:2020-01-09 16:08:05 來源:動力節(jié)點(diǎn) 瀏覽2735次


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


Java 多線程爬蟲及分布式爬蟲架構(gòu)


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


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


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


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


  維護(hù)待采集的 URL


  多線程爬蟲程序就不能像單線程那樣,每個(gè)線程獨(dú)自維護(hù)這自己的待采集 URL,如果這樣的話,那么每個(gè)線程采集的網(wǎng)頁將是一樣的,你這就不是多線程采集啦,你這是將一個(gè)頁面采集的多次。基于這個(gè)原因我們就需要將待采集的 URL 統(tǒng)一維護(hù),每個(gè)線程從統(tǒng)一 URL 維護(hù)處領(lǐng)取采集 URL ,完成采集任務(wù),如果在頁面上發(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è)分頁的新聞列表,我們在采集第一頁的時(shí)候可以得到 2、3、4、5 頁的鏈接,在采集第二頁的時(shí)候又會得到 1、3、4、5 頁的鏈接,待采集的 URL 隊(duì)列中將存在大量的列表頁鏈接,這樣就會重復(fù)采集甚至進(jìn)入到一個(gè)死循環(huán)當(dāng)中,所以就需要 URL 去重。URL 去重的方法就非常多啦,下面是幾種常用的 URL 去重方式:


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


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


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


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


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


Java 多線程爬蟲及分布式爬蟲架構(gòu)


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


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


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


       以上就是動力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java多線程爬蟲及分布式爬蟲架構(gòu)”的內(nèi)容,希望對大家有幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。


  相關(guān)內(nèi)容


  java多線程的狀態(tài)轉(zhuǎn)換以及基本操作


  常見Java多線程面試題總結(jié)


  Java多線程學(xué)習(xí),深入解析


提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 国产成人久久精品激情91 | 超级97碰碰碰碰久久久久最新 | 一级毛片在线视频 | 性猛交毛片| 国语精品91自产拍在线观看二区 | 国产成人a大片大片在线播放 | 国产香蕉一区二区在线观看 | 视频黄在线观看 | 日韩一区二区三区在线视频 | 久久99精品麻豆国产 | 狠狠操狠狠插 | 一级毛片真人免费观看 | 337p欧洲亚洲大胆艺术 | 欧美精品亚洲精品日韩专 | 亚洲欧美日本在线观看 | 国产精品入口麻豆高清在线 | 中文字幕精品1在线 | 亚洲va在线va天堂va手机 | 国产成人精品一区二区三在线观看 | 亚洲在线高清 | 日本制服丝袜在线 | 亚洲人成绝费网站色ww | 中文在线免费不卡视频 | 香蕉青草久久成人网 | 欧美日韩国产欧美 | 亚洲欧美不卡中文字幕 | 亚洲国产高清人在线 | 欧美大尺度免费一级特黄 | 欧洲国产伦久久久久久久 | 日本中文字幕高清 | 亚洲欧美日本另类 | 免费超级淫片日本高清视频 | 网络色综合久久 | 四虎免费最新在线永久 | 婷婷激情在线 | 成年女人免费视频播放77777 | 欧洲成人在线 | swag国产精品一区二区 | 深夜在线免费视频 | 久99视频| 天天曰天天干天天操 |