接上回對DHT網絡的研究,我用erlang克隆了一個磁力搜索引擎。我這個實現包含了完整的功能,DHT網絡的加入、infohash的接收、種子的獲取、資源信息的索引、搜索。
如下圖:

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