Go 语言写的 DHT 爬虫,抓取种子元数据用的
2026/7/2 22:02:10 网站建设 项目流程

文章目录

  • Go 语言写的 DHT 爬虫,抓取种子元数据用的
    • 1、DHT 爬虫是什么东西
    • 2、两种工作模式
    • 3、代码长什么样
    • 4、几个要注意的地方
    • 5、适合谁用

Go 语言写的 DHT 爬虫,抓取种子元数据用的

这个叫 dht 的项目在 GitHub 上有 2774 个 Star。用 Go 写的,实现了 BitTorrent 的 DHT 协议,主要用途是从 DHT 网络里抓取种子的元数据信息。

1、DHT 爬虫是什么东西

搞过 BT 下载的人应该知道,种子文件里记录了下载需要的元数据(文件名、大小、分片信息这些)。传统方式是去种子站找 .torrent 文件,而 DHT 爬虫走的是另一条路:直接在 DHT 网络里监听 announce 请求,然后去抓元数据。

DHT 网络本身是一个分布式哈希表,每个节点维护一部分路由信息,节点之间通过 UDP 通信互相发现。当有用户开始下载某个种子时,会向周围节点发送 announce 请求,爬虫就是靠监听这些请求来定位目标资源的。

这个库实现了四个 BEP 协议:BEP-3(部分)、BEP-5、BEP-9、BEP-10。其中 BEP-9 是获取元数据的核心,BEP-5 负责 DHT 网络的节点路由,BEP-10 处理扩展协议的握手。四个协议配合起来,才能完成从加入网络到抓取元数据的完整流程。

2、两种工作模式

库提供了两种模式,定位完全不同。

标准模式严格遵循 BEP 协议,可以当作一个正常的 DHT 服务器来用。你可以在上面构建自己的 BT 客户端,或者做一些需要标准 DHT 功能的应用。

爬虫模式专门用来抓元数据,不遵守标准协议流程,目标就是尽可能多地抓取。它会主动向大量节点发送 find_node 请求来扩张路由表,然后通过监听 announce 回调来触发元数据下载。早年的 BTDigg 搜索引擎就是用类似思路做的,bthub.io 也是基于这个库的爬虫模式搭建的。

3、代码长什么样

核心代码很短,十几行就能跑起来一个爬虫:

import("fmt""github.com/shiyanhui/dht")funcmain(){downloader:=dht.NewWire(65535)gofunc(){forresp:=rangedownloader.Response(){fmt.Println(resp.InfoHash,resp.MetadataInfo)}}()godownloader.Run()config:=dht.NewCrawlConfig()config.OnAnnouncePeer=func(infoHash,ipstring,portint){downloader.Request([]byte(infoHash),ip,port)}d:=dht.New(config)d.Run()}

逻辑是这样的:先创建一个 Wire 下载器监听响应,再配置爬虫模式的回调,每当有节点 announce 时就去请求元数据,最后启动 DHT 节点加入网络。

安装就一行:go get github.com/shiyanhui/dht

4、几个要注意的地方

默认爬虫配置大概占 300MB 内存,可以通过调整 MaxNodes 和 BlackListMaxSize 两个参数来控制。

目前不支持 NAT 穿透,局域网环境下跑不了,只能在公网 IP 的机器上用。

项目作者还提到速度可能比其他爬虫慢,因为这个库的定位是协议实现,不是纯追求速度的爬虫工具。它还会自动屏蔽疑似有问题的 IP,偶尔会误判。

5、适合谁用

想了解 BitTorrent DHT 协议怎么工作的 Go 开发者,这个库的代码结构比较清晰,标准模式和爬虫模式的实现都能直接看。四个 BEP 协议的实现代码分布在不同文件里,读起来比直接啃协议文档要直观得多。

有抓取种子元数据需求的人,爬虫模式可以直接拿来用,改改配置就能跑。作者还提供了一个编译好的 spider 二进制文件可以下载试用,不用自己编译。

正在做 BT 搜索引擎或者资源索引服务的团队,这个库的爬虫模式经过了实际项目的验证,bthub.io 就是基于它搭建的。

不用自己编译。

正在做 BT 搜索引擎或者资源索引服务的团队,这个库的爬虫模式经过了实际项目的验证,bthub.io 就是基于它搭建的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询