开源地址: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原理解析的更多相关文章

  1. [搜片神器]使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器:http://www.sosobta.com   大家可以给提点意见... 出售商业网站代码,万元起,非诚勿扰,谢谢. 联系h31h31 a ...

  2. 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源) 先直接上程序界面,了解整体工作流程是什么样子的,求服务器进行挂机测试,需要固定IP,空间大概需要10G左右(主要是BT种子占用空间 ...

  3. nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫

    项目简介 前端站点 项目效果预览 http://findcl.com 使用 nodejs 实现磁力链接爬虫 磁力链接解析成 torrent种子信息,保存到数据库,利用 Elasticsearch 实现 ...

  4. 基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)

    一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiD ...

  5. 应大数据时代而写了个磁力搜索的网页- WWW.MOVIH.COM 磁力

    应大数据时代而写了个磁力搜索的网页- 索马里搜索磁力 http://www.,movih.com/ BT磁力示例网站:WWW.MOVIH.COM 采用分布式架构: JAVA系统:JBOSS7+EJB3 ...

  6. APPcrawler基础原理解析及使用

    一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...

  7. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  8. Android中微信抢红包插件原理解析和开发实现

    一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  9. 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现

    本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...

随机推荐

  1. column 'id' in field list is ambiguous

    column 'id' in field list is ambiguous  这个错误,是因为你查询语句里面有id字段的时候,没有说明是哪个表的id字段,应该加上表名(或者别名)来区分.

  2. Drupal7网站+IIS7.0+PHP+MySql

    .服务器系统环境 Windows Server R2 Enterprise 64位操作系统 .所需软件 IIS7 PHPManager http://phpmanager.codeplex.com/r ...

  3. [原]openstack-kilo--issue(七):虚拟机怎么通外网,外网怎么ping通虚拟机

    =====问题======= 虚拟机可以ping通外网,外网能ping通虚拟机但是收不到reply 这个问题本人遇到有两种情况: 1.安装完整openstack-kilo后,在route中和虚拟机中抓 ...

  4. Java api 入门教程 之 JAVA的SYSTEM类

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. 由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类.其内部的成员变 ...

  5. 烂泥:gpg加解密软件学习

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 为什么要学习gpg呢?因为要在Linux下把一个邮箱的密码加密,不让其他人看到该邮箱真 ...

  6. Js 关于console 在IE 下的兼容问题

    程序员在开发代码的过程中,使用console作为调试代码过程的一种手段. 发布到测试生产环境,发现IE8 出现加载错误.使用开发者工具调试,发现可以绕过问题. 通过网络搜索和在项目中进行修正. 以下办 ...

  7. Mac下开启FTPserver

    开启命令 sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist   关闭命令 sudo -s launchctl unlo ...

  8. <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合

    一.前言                                                                                       几个月前的看书笔记 ...

  9. 禁止Visual Studio启动时自动连接TFS服务器

    在默认设置情况下,Visual Studio启动时,会自动连接上次打开过的TFS服务器.这种设计能够提高开发人员的工作效率,避免每次手动连接TFS服务器. 但是在某些情景中,也会给人造成不必要的麻烦, ...

  10. Eclipse汉化后怎么改回英文版(可切换中英文)

    Eclipse汉化后怎么改回英文版(可切换中英文) 很多朋友将MyEclipse汉化后还想改回英文的,其实只要修改MyEclipse的配置文件就可以了,这里我以MyEclipse7.0为例演示一下如何 ...