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

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