接上回對(duì)DHT網(wǎng)絡(luò)的研究,我用erlang克隆了一個(gè)磁力搜索引擎。我這個(gè)實(shí)現(xiàn)包含了完整的功能,DHT網(wǎng)絡(luò)的加入、infohash的接收、種子的獲取、資源信息的索引、搜索。
如下圖:

在我的筆記本上,我開(kāi)啟了100個(gè)DHT節(jié)點(diǎn),大致均勻地分布在DHT網(wǎng)絡(luò)里,資源索引速度大概在1小時(shí)一萬(wàn)個(gè)左右(包含重復(fù)資源)。
這個(gè)程序包含三大部分:
這兩個(gè)項(xiàng)目總共包含大概2500行的erlang代碼。其中,DHT實(shí)現(xiàn)部分將DHT網(wǎng)絡(luò)的加入包裝成一個(gè)庫(kù),爬蟲(chóng)部分在搜索種子時(shí),暫時(shí)沒(méi)有使用P2P里的種子下載方式,而是使用現(xiàn)成的磁力鏈轉(zhuǎn)種子的網(wǎng)站服務(wù),這樣我只需要使用erlang自帶的HTTP客戶端就可以獲取種子信息。爬蟲(chóng)在獲取到種子信息后,將數(shù)據(jù)存儲(chǔ)到mongodb里。WEB端我為了盡量少用第三方庫(kù),我只好使用erlang自帶的HTTP服務(wù)器,因此網(wǎng)頁(yè)內(nèi)容的創(chuàng)建沒(méi)有模板系統(tǒng)可用,只好通過(guò)字符串構(gòu)建,編寫(xiě)起來(lái)不太方便。
使用
整個(gè)程序依賴了兩個(gè)庫(kù):bson-erlang和mongodb-erlang,但下載依賴庫(kù)的事都可以通過(guò)rebar解決,項(xiàng)目文件里我已經(jīng)包含了rebar的執(zhí)行程序。我僅在Windows7上測(cè)試過(guò),但理論上在所有erlang支持的系統(tǒng)上都可以。
- 下載安裝mongodb
-
進(jìn)入mongodb bin目錄啟動(dòng)mongodb,數(shù)據(jù)庫(kù)目錄保存在db下,需手動(dòng)建立該目錄
mongod --dbpath db --setParameter textSearchEnabled=true
下載erlang,我使用的是R16B版本
-
下載dhtcrawler,不需要單獨(dú)下載kdht,待會(huì)下載依賴項(xiàng)的時(shí)候會(huì)自動(dòng)下載
git clone git@github.com:kevinlynx/dhtcrawler.git
-
cmd進(jìn)入dhtcrawler目錄,下載依賴項(xiàng)前需保證環(huán)境變量里有g(shù)it,例如D:\Program Files (x86)\Git\cmd
,需注意不要將bash的目錄加入進(jìn)來(lái),使用以下命令下載依賴項(xiàng)
rebar get-deps
-
編譯
rebar compile
-
在dhtcrawler目錄下,啟動(dòng)erlang
erl -pa ebin
-
在erlang shell里運(yùn)行爬蟲(chóng),erlang語(yǔ)句以點(diǎn)號(hào)(.)作為結(jié)束
crawler_app:start().
-
erlang shell里運(yùn)行HTTP服務(wù)器
crawler_http:start().
瀏覽器里輸入localhost:8000/index.html
,這個(gè)時(shí)候還沒(méi)有索引到資源,建議監(jiān)視網(wǎng)絡(luò)流量以觀察爬蟲(chóng)程序是否正確工作
爬蟲(chóng)程序啟動(dòng)時(shí)會(huì)讀取priv/dhtcrawler.config
配置文件,該文件里配置了DHT節(jié)點(diǎn)的UDP監(jiān)聽(tīng)端口、節(jié)點(diǎn)數(shù)量、數(shù)據(jù)庫(kù)地址等,可自行配置。
接下來(lái)我會(huì)談?wù)劯鞑糠值膶?shí)現(xiàn)方法。