开源磁力搜索爬虫dhtspider原理解析

标签: 开源 磁力 搜索 | 发表时间:2016-12-02 16:00 | 作者:
出处:https://lanmaowz.com/

开源地址: https://github.com/callmelanmao/dhtspider

开源的dht爬虫已经有很多了,有php版本的,python版本的和nodejs版本。经过一些测试,发现还是nodejs版本的爬虫效率最高,测试使用的是github上面的已有开源项目, https://github.com/dontcontactme/p2pspider/

p2pspider开发的时候es2015才刚出来,所以决定用es2015把p2pspider项目重写一遍,顺便深入学习一下dht爬虫的原理。

dht爬虫总体分成两个模块。

dht模块

dht模块实现一个dht节点,用来和网上的其他dht节点进行通信,在通信的过程中完成收集磁力链接的任务。

bt模块

bt模块实现一个bt协议的客户端程序,当发现一个磁力链接可以下载的时候,通过bt客户端和远程的服务器通信,下载种子的元数据,

原理解析

0×01 相关术语

1.1 P2P网络

对等计算(Peer to Peer,简称p2p)可以简单的定义成通过直接交换来共享计算机资源和服务,而对等计算模型应用层形成的网络通常称为对等网络。相信大家都用过迅雷,就不多说了。

1.2 DHT网络

DHT(Distributed Hash Table,分布式哈希表),DHT由节点组成,它存储peer的位置,是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储,其中BT客户端包含一个DHT节点,用来联系DHT中其他节点,从而得到peer的位置,进而通过BitTorrent协议下载。

简单来说DHT就是负责管理提供信息和服务节点的管理与路由功能,两个需要区分的概念:

“peer” 是在一个 TCP 端口上监听的客户端/服务器,它实现了 BitTorrent 协议。

“节点” 是在一个 UDP 端口上监听的客户端/服务器,它实现了 DHT(分布式哈希表) 协议。

1.3 Kademlia算法

Kademlia是DHT网络的一种实现。在Kademlia网络中,距离是通过异或(XOR)计算的,结果为无符号整数。distance(A, B) = |A xor B|,值越小表示越近。

1.4 KRPC协议

KRPC 是节点之间的交互协议,是由 bencode 编码组成的一个简单的 RPC 结构,他使用 UDP 报文发送。一个独立的请求包被发出去然后一个独立的包被回复。这个协议没有重发。它包含 3 种消息:请求,回复和错误。对DHT协议而言,这里有 4 种请求:

ping 检查一个节点是否有效

find_node 向一个节点发送查找节点的请求,在初始路由表或验证桶是否存活时使用

get_peers 向一个节点发送查找资源的请求

announce_peer 向一个节点发送自己已经开始下载某个资源的通知
一条KRPC消息由一个独立的字典组成,其中t和y关键字是每条信息都包含的

1.5 MagNet协议

MagNet协议,也就是磁力链接。是一个通过sha1算法生成一个20字节长的字符串,P2P客户端使用磁力链接,下载资源的种子文件,然后根据种子文件下载资源。

因已有现成的脚本实现,只需要对相关协议有个大概了解就可以动手了。

0×02 DHT爬虫

#### 2.1 实现原理

伪装成DHT节点加入DHT网络中收集信息,DHT中node(加入网络的时候随机生成)与infohash都是使用160bit的表示方式,也就是40位的16进制,意味着数量级有2^160,爬虫主要收集get_peer、announce_peer这两个请求的信息

#### 2.2 get_peer

get_peers与torrent文件的infohash有关,找到待查资源是否有peer。这时KPRC中的q=get_peers,其中包含节点id和info_hash两个参数,如果被请求的节点有对应info_hash的peers,将返回一个关键字values,如果无则返回关键字nodes,同时也返回一个token,token在annouce_peer中需要携带。

参数:

  {"id" : "<querying nodes id>", "info_hash" : "<20-byte infohash of target torrent>"}

回复:

  {"id" : "<queried nodes id>", "token" :"<opaque write token>", "values" : ["<peer 1 info string>", "<peer 2 info string>"]}

或者

  {"id" : "<queried nodes id>", "token" :"<opaque write token>", "nodes" : "<compact node info>"}

这里过来的info_hash不一定是有真实存在的

#### 2.3 announce_peer

这个请求用来表明发出announce_peer请求的节点,正在某个端口下载torrent文件。包含四个参数请求节点id、info_hash、整型端口port和tonken,收到请求的节点检查这个token,如果相同,则返回节点的IP和port等联系信息。爬虫中不能直接用announce_peer,否则很容易从上下文中判断是通报虚假资源而被禁掉。

参数:

  {"id" : "<querying nodes id>", "implied_port": <0 or 1>, "info_hash" : "<20-byte infohash of target torrent>", "port" : <port number>, "token" : "<opaque token>"}

回复:

  {"id" : "<queried nodes id>"}

0×03 bt爬虫

准确的来说是bt客户端,因为到这里一步我们已经知道种子存放的服务器ip,端口,只需要通过bt协议向服务器请求对于的种子文件就可以了。

还有另外一个方法是根据磁力哈希码通过网上的种子缓存库下载种子, http://bt.box.n0808.com/http://torrage.info/

缓存库下载的缺陷是有可能种子不存在,而通过bt客户端下载几乎可以99%获取到完整的种子元数据,所以p2pspider的效率还是很高的。

0x04 常用库

node.js常用的torrent相关库有 https://github.com/feross/webtorrent, https://github.com/themasch/node-bencode

0x05 在线搜索

在线磁力搜索网站有很多,这个只是用作测试用途, bt问问

相关 [开源 磁力 搜索] 推荐:

开源磁力搜索爬虫dhtspider原理解析

- - 蓝猫的博客 - 分享前端开发经验和教程
开源地址: https://github.com/callmelanmao/dhtspider. 开源的dht爬虫已经有很多了,有php版本的,python版本的和nodejs版本. 经过一些测试,发现还是nodejs版本的爬虫效率最高,测试使用的是github上面的已有开源项目, https://github.com/dontcontactme/p2pspider/.

手撕包菜磁力搜索引擎的开源说明

- - Xiaoxia[PG]
已经一年半载没有写博客了,搞得上来不知道写些什么. 博客上的内容还时不时有人评论,大部分我还是会一一回复的. 有些人会关注我的博客用什么主机,我的博客现在是用Linode的主机,因为现在很便宜,而且配置不差. 另外比较多的是问手撕包菜的源代码能否提供,能否出售. 今天我写这个文章就是把手撕包菜的网站开源了,包括网站页面,DHT爬虫和搜索引擎相关部分.

调研:开源搜索引擎

- - CSDN博客互联网推荐文章
本文档是对现有的开源的搜索引擎的一个简单介绍. Lucene的开发语言是java, 也是java家族中最为出名的一个开源搜索引擎, 在java世界中已经是标准的全文检索程序, 它提供了完整的查询引擎和索引引擎, 没有中文分词引擎, 需要自己去实现, 因此用Lucene去做一个搜素引擎需要自己去架构.另外它不支持实时搜索, 但linkedin和twitter有分别对Lucene改进的实时搜素.

开源搜索引擎评估:lucene sphinx elasticsearch

- - 鲁塔弗的博客
lucene系,java开发,包括 solr和 elasticsearch. sphinx,c++开发,简单高性能. 搜索引擎程序这个名称不妥当,严格说来应该叫做 索引程序(indexing program),早期主要用来做中文全文搜索,但是随着互联网的深入普及,各家网站规模越来越大,索引程序在 优化网站架构上发挥了更大的作用: 替代mysql数据库 内置的索引.

叫板Google,YaCy发布开源搜索引擎

- 洋白菜 - 36氪
一个名叫YaCy的项目要在搜索市场上向Google叫板,放出了一个开源搜索引擎,在互联网和内联网皆可使用. YaCy引擎基于点对点连接,而不是通过中央服务器进行搜索查询. 用户下载该软件后就可以进行搜索,保证内容不被审查、搜索结果不会被中央服务器记录和分析. “我们在网络上的大多数行为都和搜索有关,这是我们和所要信息的关键一环.

LinkedIn开源IndexTank,包括搜索引擎和服务

- - ITeye资讯频道
IndexTank是一家在今年10月份被LinkedIn收购的公司,它有三个主要产品:. IndexEngine:一个实时的全文搜索和索引系统. API:一个RESTful界面来处理授权、验证以及与IndexEngine(s)的通讯. Nebulizer:一个多重任务执行框架(multitenant framework),用来托管和管理无限数量的运行在IaaS层的索引.

开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)+Redis+Syslog-ng实现日志实时搜索

- - C1G军火库
ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎. 设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 支持通过HTTP使用JSON进行数据索引. logstash是一个应用程序日志、事件的传输、处理、管理和搜索的平台. 你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计.

深度搜索

- - 译言最新精选
译者: HorseHour 原文地址: streamhacker.com. 当我们准备发布 Weotta时,我们已经为如何描述它犯了难. 我们使用了机器学习和自然语言处理吗. 我们最终觉得“深度搜索”是对我们工作最贴切的描述,它是一个超越了基本文本搜索的复杂搜索系统的简洁描述. 无需赘言,不管怎么看,我们都不是这个领域唯一的一家公司;谷歌和很多其他公司都在对深度搜索的各个方面进行研究.

搜索的未来

- Levi - 月光博客
笔者认为,未来的搜索有两个趋势:个性化,社会化. (注:本文给出的很多链接需要特殊方式才可以访问,请自行解决).   从google诞生的那一天起,google的搜索本质上并没有什么变化,依旧是:一个大大的搜索框,你敲进去几个词,google给出一些相关的网页. 不同的人对于同一个关键词所期待的搜索结果可能有很大差别啊.

google搜索技巧

- - ITeye博客
搜索的词语是网页中链接内包含的关键词(可使用多个关键词). 搜索的词语是网页标题中包含的关键词(可使用多个关键词). 所搜索的文件一个特定的格式. 搜索的词语是网页中链接内包含的关键词. 搜索的词语是网页内文包含的关键词. inurl:google.com 开源. 所进行的搜索在指定的域名或网站内.