Go 语言写的 DHT 爬虫,抓取种子元数据用的
文章目录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(fmtgithub.com/shiyanhui/dht)funcmain(){downloader:dht.NewWire(65535)gofunc(){forresp:rangedownloader.Response(){fmt.Println(resp.InfoHash,resp.MetadataInfo)}}()godownloader.Run()config:dht.NewCrawlConfig()config.OnAnnouncePeerfunc(infoHash,ipstring,portint){downloader.Request([]byte(infoHash),ip,port)}d:dht.New(config)d.Run()}逻辑是这样的先创建一个 Wire 下载器监听响应再配置爬虫模式的回调每当有节点 announce 时就去请求元数据最后启动 DHT 节点加入网络。安装就一行go get github.com/shiyanhui/dht4、几个要注意的地方默认爬虫配置大概占 300MB 内存可以通过调整 MaxNodes 和 BlackListMaxSize 两个参数来控制。目前不支持 NAT 穿透局域网环境下跑不了只能在公网 IP 的机器上用。项目作者还提到速度可能比其他爬虫慢因为这个库的定位是协议实现不是纯追求速度的爬虫工具。它还会自动屏蔽疑似有问题的 IP偶尔会误判。5、适合谁用想了解 BitTorrent DHT 协议怎么工作的 Go 开发者这个库的代码结构比较清晰标准模式和爬虫模式的实现都能直接看。四个 BEP 协议的实现代码分布在不同文件里读起来比直接啃协议文档要直观得多。有抓取种子元数据需求的人爬虫模式可以直接拿来用改改配置就能跑。作者还提供了一个编译好的 spider 二进制文件可以下载试用不用自己编译。正在做 BT 搜索引擎或者资源索引服务的团队这个库的爬虫模式经过了实际项目的验证bthub.io 就是基于它搭建的。不用自己编译。正在做 BT 搜索引擎或者资源索引服务的团队这个库的爬虫模式经过了实际项目的验证bthub.io 就是基于它搭建的。