百度一下bt search
,就会发现网络上有大把的磁力链搜索引擎,最著名的莫过于海盗湾了.想要搜索就需要有资源,而资源一般都是从网络上爬取的,不同与web搜索通过主动的分析链接来一层层爬取内容,磁力链的搜索一般是通过DHT协议来获取种子信息.
DHT协议是BitTorrent协议的补充协议,在BitTorrent协议中必须有一个tracker服务器用来记录哪个peer正在下载哪个资源,然后新的peer如果请求这个资源,tracker服务器就会把前面的peer信息告诉这个新的peer,这是一个集中服务的协议,产生的问题也很明显,如果tracker不能服务,那么这个资源就在网络上找不到了,而延伸出来的DHT协议就是为了解决这个问题,它把各个peer构建成一个分布式hash表的网络,你如果需要某些资源,就在这个网络中询问,直到找到资源,这样就不需要tracker服务器就能找到想下载的资源了.
关于DHT协议请参考文末的参考文档,本文只描述实现DHT爬虫的相关思路.
DHT协议基于UDP,主要有4个方法ping
, find_node
, get_peers
, announce_peer
, 其中要实现的方法是find_node
, get_peers
, announce_peer
.
在DHT分布式网络中,我们的爬虫也是一个NODE,当这个NODE加入到DHT网络后,就会被网络中NODE加入到自己的路由表,网络的中的NODE需要通过infohash寻找某个资源时,就会想它的路由表发送get_peers
请求,请求中有infohash,我们需要回复这个请求,但是我们的爬虫并不真正拥有资源,所有只要回复一个正常的请求其中NODES信息为空即可,然后NODE在找个这个资源后会发送announce_peer
告诉它发过get_peers
的NODE我已经开始下载这个infohash的资源了.通过这个请求我们才能确认这个infohash是真正有效的infohash.而我们的爬虫的目的就是采集announce_peer
请求发送的infohash.
从以上分析可用看出,DHT爬虫采集infohash是一个被动的过程,因为我们没有资源,所以不能主动发送get_peers
, announce_peer
这样的请求去网络里面询问,我们要做的就是让尽量多的NODE把我们的NODE信息加入他们的路由表,这样他们需要请求资源的时候才会发送get_peers
, announce_peer
到我们这边.
从以上分析可知:
find_node
请求实现get_peers
, announce_peer
,对于其它的请求发送错误信息即可参考:
find_node
get_peers
, announce_peer
announce_peer
请求保存infohash信息与peer信息DHT协议翻译: http://blog.csdn.net/xxxxxx91116/article/details/8549454 DHT网络爬虫的实现: http://www.xuebuyuan.com/1287052.html