日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java多线程爬虫_Java 多线程爬虫及分布式爬虫架构

發(fā)布時間:2024/1/23 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程爬虫_Java 多线程爬虫及分布式爬虫架构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在這個時間就是金錢的年代,不可能給你時間去慢慢的采集,所以單線程爬蟲程序是行不通的,我們需要將單線程改成多線程的模式,來提升采集效率和提高計算機利用率。維護待采集的 URL多線程爬蟲程序就不能像單線程那樣,每個線程獨自維護這自己的待采集 URL,如果這樣的話,那么每個線程采集的網(wǎng)頁將是一樣的,你這就不是多線程采集啦,你這是將一個頁面采集的多次。

正文

在人們調(diào)節(jié)爬蟲程序的那時候,單線程網(wǎng)絡爬蟲沒有什么難題,但是當我們在線上環(huán)境使用單線程爬蟲程序去采集網(wǎng)頁時,單線程就普遍存在了2個致命性的難題:

采集高效率非常慢,單線程中間全是串行的,下一個執(zhí)行動作需要等上一個執(zhí)行完才能執(zhí)行。

對網(wǎng)絡服務器的CUP等使用率不高,想著人們的網(wǎng)絡服務器全是 8核16G,32G 的只跑一個線程會否太奢侈浪費

網(wǎng)上自然環(huán)境不太可能像人們當?shù)貦z測一樣,不在意采集高效率,要是能恰當獲取結果就行。在這一時間就是生命的時代,不太可能讓你時間去漸漸地的采集,因此單線程爬蟲程序是難以實現(xiàn)的,人們必須將單線程改為多核的方式,來提高采集高效率和提升電腦使用率。

多核的爬蟲程序設計方案比單線程還要繁雜許多,可是與別的業(yè)務流程在分布式系統(tǒng)下要確保信息安全又不一樣,多核網(wǎng)絡爬蟲在信息安全上升規(guī)定并不是那麼的高,由于每一網(wǎng)頁頁面能夠被當作是一個單獨體。要搞好多核網(wǎng)絡爬蟲就務必搞好二點:第一點就是說統(tǒng)一的待采集 URL 維護,第二點就是說 URL 的去重, 下邊人們簡易的來聊一聊這個方面。

維護待采集的 URL

多核爬蟲程序就不可以像單線程那般,每一線程獨自一人維護這自身的待采集 URL,假如那樣的話,那麼每一線程采集的網(wǎng)頁頁面將是一樣的,你這就并不是多核采集啦,你它是將一個網(wǎng)頁頁面采集的數(shù)次。根據(jù)這一緣故人們就必須將待采集的 URL 統(tǒng)一維護,每一線程從統(tǒng)一 URL 維護處領到采集 URL ,進行采集每日任務,假如在網(wǎng)頁頁面上發(fā)覺新的 URL 連接則加上到 統(tǒng)一 URL 維護的器皿中。下邊是幾類合適用來統(tǒng)一 URL 維護的器皿:JDK 的安全性序列,比如 LinkedBlockingQueue

性能的 NoSQL,例如 Redis、Mongodb

MQ 消息中間件

URL 的去重

URL 的去重都是多核采集的重要一步,由于假如沒去重得話,那麼人們將采集到很多反復的 URL,那樣并沒有提高人們的采集高效率,例如一個分頁查詢的新聞報道目錄,人們在采集第一頁的那時候能夠獲得 2、3、4、5 頁的連接,在采集第二頁的那時候又會獲得 1、3、4、5 頁的連接,待采集的 URL 序列軍委委員存有很多的搜索結果頁連接,那樣就會反復采集以至于進到到一個無限循環(huán)之中,因此就必須 URL 去重。URL 去重的方式就十分多啦,下邊是幾類常見的 URL 去重方法:將 URL 儲存到數(shù)據(jù)庫查詢開展去重,例如 redis、MongoDB

將 URL 放進哈希表中去重,比如 hashset

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

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

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

多線程爬蟲架構圖

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

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

多線程采集結果

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

單線程運行結果

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

分布式爬蟲架構

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

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的java多线程爬虫_Java 多线程爬虫及分布式爬虫架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。