nutch v1.9源碼分析(3)——nutch基本爬取流程

1      nutch基本爬取流程

         nutch是大名鼎鼎的Doug Cutting發起的爬蟲項目,nutch孵化了現在大數據處理事實上的標準Hadoop。在nutch V 0.8.0 版本之前,Hadoop是nutch的一部分,從nutch V0.8.0開始,HDFS和MapReduce從nutch中剝離出成爲Hadoop。v0.8.0之後,nutch就完全構建在Hadoop的基礎之上了。

         既然是爬蟲,那麼其最核心的工作就是“將網上的資源下載到本地”。nutch採用了MapReduce分佈式爬取和解析,具有良好的水平擴展性,此外,nutch還完成了諸如將爬取下來的工作建立lucene索引,建立網絡拓撲圖(web graph),鏈接分析等額外的工作。爲了支持完成這些工作,nutch採用如下物化的數據結構來保存爬取過程中的數據。


圖1 支撐nutch完成爬取的數據結構

      本系列分析文章主要關注nutch實現的基本爬蟲的功能,即上圖中黃框部分,由於圖1中省略了injector部分,故用圖2表示。


圖2 nutch基本爬取流程——業務流

        圖2是最基本的業務流視角的nutch爬取流程,流程含有inject、generate、fetch、parse、updatedb五個階段(以下皆稱之爲“階段”),一般情況下,inject階段在整個爬取過程中只會執行一次,而generate、fetch、parse、updatedb四個階段會組成一個“循環(crawl cycle)”,該循環一般會執行多次,該循環是“死循環”,一般需要外部指定條件(調用方),來終止該循環——這就是爲什麼nutch的bin/crawl腳本中會指定limit參數(nutch1.8之前叫depth參數,即從指定的種子url開始,爬取指定“深度(次數)”之後終止該循環)。當然,在不指定外部終止條件的情況下,該循環也可能終止,滿足的條件是:在指定的最大爬取間隔(默認30天)時間內,所有要爬取的url全部爬取完畢,並且在crawldb中,所有的url的狀態要麼是“fetch_success”要麼是“db_gone”。需要注意的是,如果不指定外部終止條件,如果url對應的html變化時間快於指定的最大爬取時間,該循環永遠不會終止。

        如圖3所示,該“循環”每次從各個階段共享的crawldb[1]中取出一部分url,開始本輪循環,每輪循環nutch會下載url的html原始文件,通過解析url對應的html內容發現新的url地址(outlinks,外鏈),並將不斷髮現的url加入到crawldb中,然後再開始下次循環。

圖3 nutch基本爬取流程——業務流+數據流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章