IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    通过DHT协议实现磁力链搜索

    Timmy (zhu327@qq.com)发表于 2015-07-27 10:42:39
    love 1

    百度一下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到我们这边.
    从以上分析可知:

    1. 要让DHT网络中尽可能多的NODE在路由表中加入我们爬虫的信息,通过不停的发送find_node请求实现
    2. 实现了1后,就是被动的等待了,只回应get_peers, announce_peer,对于其它的请求发送错误信息即可

    实现

    参考:

    https://github.com/old-woman/simDHT

    1. 创建一个UDP的socket,并且绑定端口监听
    2. 复用这个端口不断发送find_node
    3. 接受并回复get_peers, announce_peer
    4. 分析announce_peer请求保存infohash信息与peer信息

    资料

    DHT协议翻译: http://blog.csdn.net/xxxxxx91116/article/details/8549454 DHT网络爬虫的实现: http://www.xuebuyuan.com/1287052.html



沪ICP备19023445号-2号
友情链接