分布式網(wǎng)絡(luò)爬蟲關(guān)鍵技術(shù)分析與實(shí)現(xiàn)0001_第1頁
分布式網(wǎng)絡(luò)爬蟲關(guān)鍵技術(shù)分析與實(shí)現(xiàn)0001_第2頁
分布式網(wǎng)絡(luò)爬蟲關(guān)鍵技術(shù)分析與實(shí)現(xiàn)0001_第3頁
分布式網(wǎng)絡(luò)爬蟲關(guān)鍵技術(shù)分析與實(shí)現(xiàn)0001_第4頁
分布式網(wǎng)絡(luò)爬蟲關(guān)鍵技術(shù)分析與實(shí)現(xiàn)0001_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、? 一、 研究所屬范圍分布式網(wǎng)絡(luò)爬蟲包含多個(gè)爬蟲, 每個(gè)爬蟲需要完成的任務(wù)和單個(gè)的爬行器類似, 它們從互聯(lián) 網(wǎng)上下載網(wǎng)頁,并把網(wǎng)頁保存在本地的磁盤,從中抽取URL并沿著這些 URL 的指向繼續(xù)爬行。由于并行爬行器需要分割下載任務(wù),可能爬蟲會(huì)將自己抽取的URL 發(fā)送給其他爬蟲。這些爬蟲可能分布在同一個(gè)局域網(wǎng)之中,或者分散在不同的地理位置。根據(jù)爬蟲的分散程度不同,可以把分布式爬行器分成以下兩大類:1、基于局域網(wǎng)分布式網(wǎng)絡(luò)爬蟲:這種分布式爬行器的所有爬蟲在同一個(gè)局域網(wǎng)里運(yùn)行,通過高 速的網(wǎng)絡(luò)連接相互通信。 這些爬蟲通過同一個(gè)網(wǎng)絡(luò)去訪問外部互聯(lián)網(wǎng), 下載網(wǎng)頁, 所有的網(wǎng) 絡(luò)負(fù)載都集中在他們所在的那個(gè)局

2、域網(wǎng)的出口上。 由于局域網(wǎng)的帶寬較高, 爬蟲之間的通信 的效率能夠得到保證; 但是網(wǎng)絡(luò)出口的總帶寬上限是固定的, 爬蟲的數(shù)量會(huì)受到局域網(wǎng)出口 帶寬的限制。2、基于廣域網(wǎng)分布式網(wǎng)絡(luò)爬蟲: 當(dāng)并行爬行器的爬蟲分別運(yùn)行在不同地理位置 (或網(wǎng)絡(luò)位置) , 我們稱這種并行爬行器為分布式爬行器。例如,分布式爬行器的爬蟲可能位于中國,日本, 和美國,分別負(fù)責(zé)下載這三地的網(wǎng)頁;或者位于CHINANET ,CERNET,CEINET,分別負(fù)責(zé)下載這三個(gè)網(wǎng)絡(luò)的中的網(wǎng)頁。分布式爬行器的優(yōu)勢在于可以子在一定程度上分散網(wǎng)絡(luò)流量, 減小網(wǎng)絡(luò)出口的負(fù)載。如果爬蟲分布在不同的地理位置(或網(wǎng)絡(luò)位置), 需要間隔多長時(shí)間 進(jìn)行一

3、次相互通信就成為了一個(gè)值得考慮的問題。 爬蟲之間的通訊帶寬可能是有限的, 通常 需要通過互聯(lián)網(wǎng)進(jìn)行通信。在實(shí)際應(yīng)用中, 基于局域網(wǎng)分布式網(wǎng)絡(luò)爬蟲應(yīng)用的更廣一些, 而基于廣域網(wǎng)的爬蟲由于 實(shí)現(xiàn)復(fù)雜, 設(shè)計(jì)和實(shí)現(xiàn)成本過高, 一般只有實(shí)力雄厚和采集任務(wù)較重的大公司才會(huì)使用這種 爬蟲。本論文所設(shè)計(jì)的爬蟲就是基于局域網(wǎng)分布式網(wǎng)絡(luò)爬蟲。、分布式網(wǎng)絡(luò)爬蟲整體分析分布式網(wǎng)絡(luò)爬蟲的整體設(shè)計(jì)重點(diǎn)應(yīng)該在于爬蟲如何進(jìn)行通信。 目前分布式網(wǎng) 絡(luò)爬蟲按通信方式不同分布式網(wǎng)路爬蟲可以分為主從模式、 自治模式與混合模式 三種。主從模式是指由一臺(tái)主機(jī)作為控制節(jié)點(diǎn)負(fù)責(zé)所有運(yùn)行網(wǎng)絡(luò)爬蟲的主機(jī)進(jìn)行管理, 爬蟲只 需要從控制節(jié)點(diǎn)那里接

4、收任務(wù), 并把新生成任務(wù)提交給控制節(jié)點(diǎn)就可以了, 在這個(gè)過程中不 必與其他爬蟲通信,這種方式實(shí)現(xiàn)簡單利于管理。而控制節(jié)點(diǎn)則需要與所有爬蟲進(jìn)行通信, 它需要一個(gè)地址列表來保存系統(tǒng)中所有爬蟲的信息。 當(dāng)系統(tǒng)中的爬蟲數(shù)量發(fā)生變化時(shí), 協(xié)調(diào) 者需要更新地址列表里的數(shù)據(jù), 這一過程對于系統(tǒng)中的爬蟲是透明的。 但是隨著爬蟲網(wǎng)頁數(shù) 量的增加。 控制節(jié)點(diǎn)會(huì)成為整個(gè)系統(tǒng)的瓶頸而導(dǎo)致整個(gè)分布式網(wǎng)絡(luò)爬蟲系統(tǒng)性能下降。 主從 模式的整體結(jié)構(gòu)圖:自治模式是指系統(tǒng)中沒有協(xié)調(diào)者,所有的爬蟲都必須相互通信,比主從模式 下爬蟲要復(fù)雜一些。 自治模式的通信方式可以使用全連接通信或環(huán)形通信。 全連 接通信是指所用爬蟲都可以相互發(fā)送

5、信息, 使用這種方式的每個(gè)網(wǎng)絡(luò)爬蟲會(huì)維護(hù) 一個(gè)地址列表, 表中存儲(chǔ)著整個(gè)系統(tǒng)中所有爬蟲的位置, 每次通信時(shí)可以直接把 數(shù)據(jù)發(fā)送給需要此數(shù)據(jù)的爬蟲。 當(dāng)系統(tǒng)中的爬蟲數(shù)量發(fā)生變化時(shí), 每個(gè)爬蟲的地 址列表都需要進(jìn)行更新。 環(huán)形通信是指爬蟲在邏輯上構(gòu)成一個(gè)環(huán)形網(wǎng), 數(shù)據(jù)在環(huán) 上按順時(shí)針或逆時(shí)針單向傳輸, 每個(gè)爬蟲的地址列表中只保存其前驅(qū)和后繼的信 息。爬蟲接收到數(shù)據(jù)之后判斷數(shù)據(jù)是否是發(fā)送給自己的, 如果數(shù)據(jù)不是發(fā)送給自 己的,就把數(shù)據(jù)轉(zhuǎn)發(fā)給后繼;如果數(shù)據(jù)是發(fā)送給自己的,就不再發(fā)送。假設(shè)整個(gè) 系統(tǒng)中有 n 個(gè)爬蟲,當(dāng)系統(tǒng)中的爬蟲數(shù)量發(fā)生變化時(shí), 系統(tǒng)中只有 n-1 個(gè)爬蟲的 地址列表需要進(jìn)行更新。混合

6、模式是結(jié)合上面兩種模式的特點(diǎn)的一種折中模式。 該模式所有的爬蟲都可以 相互通信同時(shí)都具有任務(wù)分配功能。 不過所有爬蟲中有個(gè)特殊的爬蟲, 該爬蟲主 要功能對已經(jīng)經(jīng)過爬蟲任務(wù)分配后無法分配的任務(wù)進(jìn)行集中分配。 使用這個(gè)方式 的每個(gè)網(wǎng)絡(luò)爬蟲只需維護(hù)自己采集范圍的地址列表。 而特殊爬蟲需除了保存自己 采集范圍的地址列表外還保存需要進(jìn)行集中分配的地址列表。 混合模式的整體結(jié) 構(gòu)圖:三、大型分布式網(wǎng)絡(luò)爬蟲體系結(jié)構(gòu)圖:從這些圖可以看出, 分布式網(wǎng)絡(luò)爬蟲是一項(xiàng)十分復(fù)雜系統(tǒng)。 需要考慮很多方面因素。 性 能可以說是它這重要的指標(biāo)。當(dāng)然硬件層面的資源也是必須的。不過不在本系列考慮范圍。 從下篇開始, 我將從單機(jī)網(wǎng)

7、絡(luò)爬蟲一步步介紹我們需要考慮的問題的解決方案。 如果大家有 更好的解決方案。歡迎指教。吉日的一句話說的很有道理, 一個(gè)人一輩子只能做好幾件事。 希望大家支持我的這個(gè)系 列。談?wù)劸W(wǎng)絡(luò)爬蟲設(shè)計(jì)中的問題網(wǎng)絡(luò)蜘蛛現(xiàn)在開源的已經(jīng)有好幾個(gè)了, Larbin ,Nutch ,Heritrix 都各有用戶之地,要做 一個(gè)自己的爬蟲要解決好多個(gè)問題, 比如調(diào)度算法、更新策略、分布式存儲(chǔ)等,我們來一一 看一下。一個(gè)爬蟲要做的事主要有以下這些1.從一個(gè)網(wǎng)頁入口,分析鏈接,一層一層的遍歷,或者從一組網(wǎng)頁入口,或者從一個(gè) rss 源列表開始爬 rss ;2.獲取每個(gè)頁面的源碼保存在磁盤或者數(shù)據(jù)庫里;3. 遍歷抓下來的網(wǎng)

8、頁進(jìn)行處理,比如提取正文,消重等;4. 根據(jù)用途把處理后的文本進(jìn)行索引、分類、聚類等操作。以上是個(gè)人理解哦,呵呵。這些過程中,大約有如下問題 如何獲取網(wǎng)頁源或者 RSS 源 如果是一般的爬蟲的話, 就是給幾個(gè)入口頁面, 然后順著超鏈接以遍歷圖的算法一個(gè)頁面一 個(gè)頁面的爬,這種情況網(wǎng)頁源很少,可以選擇從 hao123 等網(wǎng)址大全的網(wǎng)站為入口開始爬。 如果做垂直搜索的話就人工去收集一些這個(gè)行業(yè)的網(wǎng)站, 形成一個(gè)列表, 從這個(gè)列表開始爬。 如果是爬 RSS 的話,需要先收集 RSS源,現(xiàn)在大的門戶的新聞?lì)l道和主流的博客系統(tǒng)都有 rss 的功能,可以先爬一遍網(wǎng)站,找出 rss 的鏈接,要獲取每個(gè)鏈接的

9、內(nèi)容,分析是否是 rss 格式,如果是就把這個(gè)鏈接保存到 rss源數(shù)據(jù)庫里, 以后就專門爬這個(gè) rss源的 rss。還有一 種就是人工來整理,一般 blog 的 rss 都是有規(guī)律的,主域名跟一個(gè)用戶名后面再跟上一個(gè) rss 的固定頁面,比如,這樣就弄一個(gè)用戶字典,拼接 rss 地址,然后用程序去探測是否有 這個(gè)頁面來整理出每個(gè)網(wǎng)站的 rss 源。整理出 rss 源后再人工設(shè)置 rss 源的權(quán)重及刷新時(shí)間 間隔等。如果源頁面很多,如何用多線程去有效的調(diào)度處理,而不會(huì)互相等待或者重復(fù)處理 如果現(xiàn)在有 500 萬個(gè)頁面要去爬,肯定要用多線程或者分布式多進(jìn)程去處理了??梢园秧?面進(jìn)行水平分割, 每個(gè)

10、線程處理一段兒, 這樣每個(gè)線程之間不需要同步, 各自處理各自的就 行了。比如給這 500W 個(gè)頁面分配一個(gè)自增 ID,2 個(gè)線程的話就讓第一個(gè)線程去爬1, 3,5的網(wǎng)頁,第二個(gè)線程去爬 2, 4,6 的網(wǎng)頁,這樣做多個(gè)線程間基本上能均衡,而且不會(huì)相 互等待,而且不會(huì)重復(fù)處理,也不會(huì)拉掉網(wǎng)頁。每個(gè)線程一次取出 1w 個(gè)頁面,并記錄最高 的源頁面 ID 號,處理完這一批后再從數(shù)據(jù)庫里提取大于這個(gè)源頁面 ID 號的下 1W 個(gè)頁面, 直到抓取完本線程要處理的所有頁面。 1w 這個(gè)值根據(jù)機(jī)器的內(nèi)存可做適當(dāng)?shù)恼{(diào)整。為了防 止抓了半截兒死機(jī), 所以要支持?jǐn)帱c(diǎn)續(xù)抓, 要為每個(gè)線程的處理進(jìn)度保存狀態(tài), 每取一

11、批網(wǎng) 頁都要記錄本線程最大的網(wǎng)頁 ID,記錄到數(shù)據(jù)庫里,進(jìn)程重啟后可以讀取這個(gè) ID ,接著抓 后面的頁面。如何盡量的利用 CPU ,盡量的不讓線程處于等待、休眠、阻塞等空閑狀態(tài)而且要盡量用少 的線程以減少上下文切換。爬蟲有兩個(gè)地方需要 IO 操作,抓網(wǎng)頁的時(shí)候需要通過網(wǎng)卡訪問網(wǎng)絡(luò),抓到網(wǎng)頁后要把內(nèi)容 寫到磁盤或者數(shù)據(jù)庫里。所以這兩個(gè)部分要用異步 IO 操作,這樣可以不用線程阻塞在那里 等待網(wǎng)頁抓過來或者寫完磁盤文件,網(wǎng)卡和硬盤都支持內(nèi)存直接讀取,大量的 IO 操作會(huì)在 硬件驅(qū)動(dòng)的隊(duì)列里排隊(duì), 而不消耗任何 CPU。.net 的異步操作使用了線程池, 不用自己頻繁 的創(chuàng)建和銷毀線程,減少了開銷

12、,所以線程模型不用考慮, IO 模型也不用考慮, .net 的異 步 IO 操作直接使用了完成端口,很高效了,內(nèi)存模型也不需要考慮,整個(gè)抓取過程各線程不需要訪問共享資源,除了數(shù)據(jù)庫里的源頁面,各管各的,而且也是每個(gè)線程分段處理,可 以實(shí)現(xiàn)無鎖編程。如何不采集重復(fù)的網(wǎng)頁去重可以使用 king 總監(jiān)的布隆過濾器 ,每個(gè)線程使用一個(gè) bitarray ,里面保存本批源頁面上次 抓取的頁面的哈希值情況, 抓取下來的源頁面分析鏈接后, 去這個(gè) bitarray 里判斷以前有沒 有抓過這個(gè)頁面, 沒有的話就抓下來, 抓過的話就不管了。 假設(shè)一個(gè)源頁面有 30 個(gè)鏈接把, 一批 10W 個(gè)源頁面, 300w

13、 個(gè)鏈接的 bitarray 應(yīng)該也不會(huì)占太大內(nèi)存。 所以有個(gè)五六個(gè)線程 同時(shí)處理也是沒問題的。抓下來的頁面更快的保存保存到分布式文件系統(tǒng)還是保存在數(shù)據(jù)庫里 如果保存到磁盤, 可以每個(gè)域名創(chuàng)建一個(gè)文件夾, 凡是這個(gè)網(wǎng)站的頁面都放到這個(gè)文件夾下, 只要文件名不一樣, 就不會(huì)出現(xiàn)沖突。 如果把頁面保存到磁盤, 數(shù)據(jù)庫有自己的一套鎖管理 機(jī)制,直接用 bulk copy 放數(shù)據(jù)庫就行了。 一般頻繁的寫磁盤可能會(huì)引起 CPU過高,而頻繁 的寫數(shù)據(jù)庫 CPU 還好一些。而且 sqlserver2008 支持 類型 的字段,在保存大文本字段的時(shí)候 有很好的性能,并且還能使用數(shù)據(jù)庫的 API 來訪問。所以我覺得如果沒有 GFS 那樣高效成 熟的分布式文件系統(tǒng)的話還不如存 sqlserver 里面呢。如何有效的根據(jù)網(wǎng)頁的更新頻率來調(diào)整爬蟲的采集時(shí)間間隔 做爬蟲要了解一些 HTTP 協(xié)議,如果要抓的網(wǎng)頁支持 Last-Modified 或者 ETag 頭,我們可以先 發(fā)個(gè) head 請求來試探這個(gè)頁面有沒有變化來決定是否要重新抓取,但是好多網(wǎng)站根本就不支持這個(gè)東西, 所以讓爬蟲也很費(fèi)勁, 讓自己的網(wǎng)站也會(huì)損失更多的性能。 這樣我們就要自 己去標(biāo)注每個(gè)源頁面的更新時(shí)間間隔及權(quán)重,再根據(jù)這兩個(gè)值去用一定的算法 制定蜘蛛的更新策略。采集下來的數(shù)據(jù)做什么用可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論