dht:Go 写的 BitTorrent DHT 爬虫
dht:Go 写的 BitTorrent DHT 爬虫
在 GitHub 上有 2,774 Star。
shiyanhui/dht 这个项目用 Go 实现了 BitTorrent 的 DHT 协议。它能干两件事:一是作为标准 DHT 服务器跑,二是以爬虫模式去抓取网络里的种子元数据。

实现了哪些协议
项目支持四个 BEP 协议:
- BEP-3(部分)
- BEP-5
- BEP-9
- BEP-10
这几个协议覆盖了 DHT 的核心功能。BEP-5 定义了如何在 DHT 网络里找节点和存储数据,BEP-9 是元数据扩展,能让你拿到种子文件的信息而不用下载整个种子。
两种模式
标准模式就是规规矩矩按协议来,可以当一个正常的 DHT 服务器用。
爬虫模式不一样。它不完全遵守 BEP 协议,目标是尽可能多地抓取元数据。收到 AnnouncePeer 请求时,它会主动去拉取对应的种子信息。用这个模式,你可以搭一个类似 BTDigg 那样的 BT 搜索引擎。

代码示例
用起来不复杂。创建一个 Wire 下载器,监听响应,然后配置爬虫模式的回调:
downloader := dht.NewWire(65535)
go func() {
for resp := range downloader.Response() {
fmt.Println(resp.InfoHash, resp.MetadataInfo)
}
}()
go downloader.Run()
config := dht.NewCrawlConfig()
config.OnAnnouncePeer = func(infoHash, ip string, port int) {
downloader.Request([]byte(infoHash), ip, port)
}
d := dht.New(config)
d.Run()
代码量不大,核心逻辑就是监听 DHT 网络里的节点广播,拿到 InfoHash 和 IP/Port,然后请求元数据。
几个注意点
默认配置大概吃 300M 内存。如果资源有限,调整 MaxNodes 和 BlackListMaxSize 这两个参数。
另外目前不支持 NAT 穿透,也就是说只能在公网环境下跑,局域网里不行。项目 TODO 里有 NAT Traversal 的计划,但还没实现。
爬虫模式下速度可能会比专门的爬虫慢一些。这是因为项目本身优先实现标准协议,不是专门为爬取优化的。加上有 IP 黑名单机制,可能会误封一些正常节点。
适合谁用
想自己搭 BT 资源搜索引擎的开发者,或者想研究 DHT 协议实现的人。代码是 Go 写的,结构清晰,读起来不费劲。
想自己搭 BT 资源搜索引擎的开发者,或者想研究 DHT 协议实现的人。代码是 Go 写的,结构清晰,读起来不费劲。
更多推荐
所有评论(0)