DHT爬虫(golang版-附源码)

前言

关于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进行了测试,没有做页面(担心太好用-)。

kibana测试

最后:

楼主用的腾讯云服务器,搜索的效率很低,一天也就几百个,目前认为效率低两个方面的问题。
1: 服务器的上传带宽只有1M,每秒只能发大约1000-1300个包,收集的有效hash就很少。
2: 刚刚得到的hash信息,下载metadata的时候大多数都是timeout,这里还不清楚为什么,有了解的大佬还望告知。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。