讀了一段時間的原始碼,結合網上的文件和自己的理解來詳解下heritrix的體系結構,總體來說hertitrix是乙個設計優良的框架,擴充套件性極強,除了無法實現分布式之外,其他部件都可以被擴充套件。
[b]體系結構[/b]
frontier(邊界部件): 跟蹤哪個預定的uri將被收集,和已經被收集的uri,選擇下乙個 uri,剔除已經處理過的uri.有三個核心方法next(),schedule(),finished().
crawlscope(範圍部件):設定應該在什麼範圍內抓取網頁鏈結.如域限制,不受限制
[b]控制器[/b]
**控制器是抓取的核心元件.它決定抓取的開始、結束和暫停.從frontier獲取uri,傳遞給toepool中的toethread處理.
類中定義了一下元件
crawlerorder配置檔案物件
crawlerscope抓取範圍控制物件
processorchainlist處理鏈物件
frontier邊界部件
toepool執行緒池
servercache快取,他儲存了所有在當前任務重抓取過的host名稱和server名稱(包括ip位址,歷史記錄,機械人策略.)
[b]邊界部件[/b]
跟蹤哪個預定的uri將被收集,和已經被收集的uri,選擇下乙個 uri,剔除已經處理過的uri.
排程器負責從url庫中選擇需要抓取的url列表,它是整個spider系統的大腦,此模組是實現了優雅抓取的核心,排程器針對url採用了域雜湊,可以保證不會同時有兩個執行緒抓取同乙個域下的url,並且對每個域的抓取間隔都有控制;
具體實現 得到乙個url通過解析得到他的主網域名稱(例如: 解析後的主網域名稱就為www.autohome.com.cn)把此主網域名稱做key所有此網域名稱下的url物件都儲存在這個key中的bdb中.具體見下圖
[table]
|key1 |queue1(url1,url2,url3,…)|
|key2 |queue2(urlx,…)|
|key3 |queue3(…)|
|… |…|
[/table]
以上key值的生成方式可以根據使用者需求拓展,這裡提供了兩種策略.
elhash生成:elfhash生成是按雜湊生成key,這能明顯提高抓取速度,可是這樣會對伺服器照成壓力.
每次得到乙個url物件的時候就會鎖定這個key值,直到其執行完並且過了等待時間(比如配置的是50k/s而實際抓取是100k/s則會讓佇列睡眠等待成配置的速度+配置檔案中配置的間隔上一次訪問訪問時間)才會解鎖,這保證了同一時間內只會有乙個執行緒抓取此網域名稱的url.
此類裡面實現乙個過濾器,抓們用來過濾當前需要被加入的鏈結物件是否已經抓取過.過濾器可以根據使用者需求拓展.
此服務還實現了url抓取的計數(訪問,排除,成功,失敗),去重服務,url備份以及日誌服務
[b]處理器鏈[/b]
許多processor組成乙個處理鏈(processor chains)中,每乙個處理鏈對uri進行一系列的處理.
(1)pre-fetch processing chain(預處理鏈)
(2)fetch processing chain(抓取處理鏈)
從遠端伺服器獲取資料
(3) extractor processing chain(抽取處理鏈)
從網頁中抽取新的uri
(4)write/index processing chain(寫處理鏈)
負責把資料寫入本地磁碟、db、dbd
(5)post-processing chain(後置處理鏈)
把抽取出來的url加入到佇列
整個處理鏈由管理員配置,可以每乙個processor塊都可以由多個處理
processor類:代表當個的處理器,素有的處理器都是他的子類
processorchain類:此類類似於乙個佇列,裡面包括了同種型別的幾個processor
processorchainlist類:此類儲存了此次抓取所設定的所有處理器鏈.
比如fetchhtml用來得到html頁面,fetchdns用來得到dns資訊,他們都繼承fetch類,fetch繼承processor.多個processor組成processorchainlist.
[b]執行緒池(toepool)[/b]
線城池(toepool)是乙個標準的執行緒池,他用來管理所有抓取執行緒(toethread),每個抓取執行緒向frontier要乙個url然後呼叫處理鏈.
[b]去重策略[/b]
先抓取網頁,把uri和網頁摘要儲存到hash表中.第二次抓取相同uri根據uri查詢並比較之前存入hash表中的摘要是否相同
[b]fetchhtml[/b]
這是處理鏈中的乙個實現,用來獲取html內容.他首先判斷能否抓取html,在抓取過程中將網頁資訊寫入記憶體,然後計算網頁摘要值sha1或md5,fetchhtml會把每個url訪問的cookie儲存
[b]配置服務[/b]
heritrix編寫了一套強大的配置服務系統,所有的配置服務都繼承與此服務。其中有個很重要的超類complextype,所有配置模組超類,這個類是通用的配置框架的核心,所有可配置的模組都擴充套件這個類或是他的子類.本類的所有子類都將自動遵循jmx的dynamicmbean
Hadoop效能調優 一 總述
hadoop的效能調優主要分為以下六個方面 changing number of map and reduce tasks decrease intermediate data size using combiner decrease map side disk spill decrease int...
手遊深度效能測試(一)總述
隨著刺激戰場的出現,標誌著手遊逐漸進入了重度遊戲佔主流的新階段,手機的處理能力已經越來越成為制約遊戲滲透玩家的重要瓶頸,而且按照目前的發展趨勢,玩家對於畫質精細度的訴求越來越高,在玩家換機頻率沒有明顯提公升之前,如何保證手遊客戶端的流暢性和穩定性成為擺在眾多遊戲廠商面前的重要課題。手遊客戶端深度效能...
設計原則總述
moon1128 設計原則 1.開 閉 原則 open closed principle,ocp 2.黎克特制代換原則 liskov substitution principle,lsp 3 依賴倒轉原則 dependency inversion principle,dip 4 介面隔離原則 int...