解密搜索引擎技術之爬蟲Larbin
一、簡介
Larbin是一個用C++開發的開源網絡爬蟲,有一定的定制選項和較高的網頁抓取速度。
Larbin爬蟲結構圖及主要模塊對應關系如下圖所示:
Larbin的運行過程可以描述如下:種子URL文件最初初始化*URLsDisk,讀取到namedSiteList中,通過adns庫調用,逐漸往Fifo<NamedSite> *dnsSites和Fifo<IPSite>*okSites內裝入鏈接,而Fetch模塊直接從Fifo<IPSite> *okSites中獲得用于抓取的URL,為抓取到的網頁建立hash表,以防止網頁的重復抓取。然后通過html類的方法從下載到的網頁中析取出新的URL,新加入前端隊列的URL要求符合robots filter,并通過hash表對URL去重。一次抓取結束后進行相關的讀寫操作,然后通過poll函數選擇適合的套接字接口,開始新的抓取。這樣抓取就可以一直循環下去,直到用戶終止或者發生中斷。
更多關于Larbin項目的細節(包括源碼)可以參看這里。
二、安裝
這里以在CentOS 6.2下源碼安裝larbin-2.6.3.tar.gz為例說明之。
解壓到指定目錄后,如果直接./configure,一般會出現缺少依賴makedepend的錯誤,如下安裝改依賴即可:
- #yum install makedepend
- #./configure
./configure成功后,如果直接make同樣會出現錯誤,主要如下:
- parse.c:113: error: conflicting types for ‘adns__parse_domain’
- internal.h:569: note: previous declaration of ‘adns__parse_domain’ was here
根據提示直接去adns目錄找到internal.h注釋掉該函數即可。
再次make,依然出現錯誤,這次主要是因為代碼用老式C代碼編寫,具體表現如下:
- input.cc:6:22: error: iostream.h: No such file or directory
采用如下命令替換 iostream.h為 iostream:
- #sed -i -e 's/iostream.h/iostream/g' `grep -rl iostream.h *`
注意上面包含grep的不是單引號而是Esc鍵下面那個符號`。
再次make,出現大量錯誤,原因同上,表現如下:
- hashTable.cc:32: error: ‘cerr’ was not declared in this scope
- hashTable.cc:41: error: ‘cerr’ was not declared in this scope
- hashTable.cc:42: error: ‘endl’ was not declared in this scop
執行如下命令將cerr和endl替換為std::cerr和std::endl:
- #sed -i -e 's/cerr/std::cerr/g' `grep -rl cerr *`
- #sed -i -e 's/endl/std::endl/g' `grep -rl endl *`
再次make就不會有問題了,編譯完后在當前目錄下會產生larbin可執行文件。
- #./larbin
- larbin_2.6.3 is starting its search
看到上面屏幕輸出說明成功啟動larbin了。
三、配置
上面方式啟動larbin會使用默認配置文件larbin.conf,當然也可以如下來指定配置文件:
- #./larbin -c conf_file
larbin的配置是通過options.h和larbin.conf結合來完成的,前者修改后需要重新編譯,后者修改后只需要重啟即可。
在options.h中以下參數最好打開:
- #define SIMPLE_SAVE //簡單保存抓取頁面,存在save/dxxxxx/fyyyyy文件中,每個目錄下2000個文件
- #define FOLLOW_LINKS //繼續抓取子鏈接
- #define CGILEVEL 1 //是否獲得CGI
- #define DEPTHBYSITE //進入新的URL時是否初始化深度
- #define RELOAD //設置此項時可以從上次終止處繼續爬取,使用-scratch 選項從上次結束處重啟
- #define CRASH //用于報告嚴重的bugs用,以gmake debug模式編譯時使用
配置完別忘了make。
在larbin.conf中以下參數最好打開:
- httpPort 8081 //用于查看爬行結果的web服務端口
- inputPort 1976 //用于設置爬行url的telnet服務端口
- pagesConnexions 100 //并行抓取網頁的連接數
- dnsConnexions 5 //并行DNS解析的數量
- depthInSite 5 //對一個站點的爬取深度
- waitDuration 60 //訪問同一服務器的時間間隔,不可低于30s,建議60s
- startUrl http://slashdot.org/ //起始抓取頁面
關于配置的詳細可以參見這里。
配置好就可以啟動服務開始抓取了。
關于起始抓取url除了可以設置外,還可以通過telnet localhost 1976來設置,在終端提示符下輸入:
- priority:1 depth:3 test:0
- http://www.baidu.com
這里把優先級設為了1,保證你輸入的URL比一般的URL優先被抓取,如果輸入了很多URL,把優先級設為0,防止run out of memory。
depth指定抓取鏈接的深度,一般不要超過5。
test設為0表示如果一面網頁之前已經抓取過了,并且現在又要抓取,那就抓取,test設為1可以防止重復的抓取。
這里設置的效果同larbin.conf中的startUrl。
四、使用
運行:./larbin(或“nohup ./larbin &”,可使larbin在后臺運行)
中止:Ctrl+C
重啟:./larbin -scratch
注意停止larbin的時候不要用Ctrl+z,那樣當你再次./larbin或者./larbin -scratch的時候,會出現端口已被占用,無法重新啟動。
另外,可通過http://localhost:8081來訪問larbin,從頁面上獲取一些關于larbin運行的信息。