前言
關于DHT網絡的一些原理網上很多,這里就不搬運了,以下鏈接可供參考
http://codemacro.com/2013/05/19/crawl-dht/
http://www.cppblog.com/kevinlynx/archive/2013/05/19/200410.html
以及協議官方的地址:
http://www.bittorrent.org/beps/bep_0005.html
http://www.bittorrent.org/beps/bep_0009.html
http://www.bittorrent.org/beps/bep_0010.html
talk is cheap,直接上代碼吧 https://github.com/dotaljyajxf/DHTsimple 歡迎點星
簡介
DHT爬蟲要做的事情,首先就是要加入到DHT網絡中,這樣就會源源不斷收到其他節點發過來的請求,然后從中獲取種子的hash值。
那么問題來了
1: 怎么加入到DHT網絡中?
2: 怎么讓其他節點給你發消息?
3: 哪些請求里面包含hash信息?
看過上面的文章,大家應該明白DHT網絡中節點之間的通信只有下面4種請求
- ping
- find_node
- get_peer
- announce_peer
1:加入DHT網絡
要加入網絡要給下面的根地址發消息:
"router.utorrent.com:6881",
"router.bittorrent.com:6881",
"dht.transmissionbt.com:6881",
向這幾個節點查找任意節點(發送find_node請求),然后他們會返回距離該節點最近的K個節點,那么我們再依次向K個節點查找任意節點,以此類推,就有更多的節點認識自己。
2: 加入網絡后就會收到其他節點的信息,認識的節點越多收到的消息就越多,所以爬蟲應該盡可能讓更多的節點認識自己
3: 要獲取的hash信息主要是來自announce_peer請求,這個請求同時還會攜帶ip和port信息,get_peer也可以得到一個hash信息,但是這個hash不能確定是否真實存在,如果我們只是想得到hash值然后通過其的軟件下載,也可以把這個hash收集起來。
另外announce_peer請求中implied_port這個字段,表示忽略參數中的port,繼續使用默認的udp端口,這個記得處理。
得到的hash只需要hex之后,就可以通過某雷下載了
下載metadata
得到了hash需要去下載元數據,元數據中包含主題名稱,以及種子包含的所有文件的名稱,這樣就可以做一些搜索了。
Bt協議調試了很久,出錯的時候認真核對協議檢查每一個細節。(參考上面bep_0009,bep_0010的鏈接)
下載之后的信息直接保存到了elasticsearch,建立了torrent-日期的模板索引,當機器存儲不足的時候可以刪除一些舊的數據,或者遷移到別處,并對種子名和種子中包含的每個文件名稱做了全文索引,這樣一個簡單的磁力鏈接搜索器就可以運行了。不過這里只在本地用kibana進行了測試,沒有做頁面(擔心太好用-)。
最后:
樓主用的騰訊云服務器,搜索的效率很低,一天也就幾百個,目前認為效率低兩個方面的問題。
1: 服務器的上傳帶寬只有1M,每秒只能發大約1000-1300個包,收集的有效hash就很少。
2: 剛剛得到的hash信息,下載metadata的時候大多數都是timeout,這里還不清楚為什么,有了解的大佬還望告知。