开源地址: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. Linux 虚拟机网络适配器从E1000改为VMXNET3

    我们知道VMware的网络适配器类型有多种,例如E1000.VMXNET.VMXNET 2 (Enhanced).VMXNET3等,就性能而言,一般VMXNET3要优于E1000,下面介绍如果将Lin ...

  2. 十五天精通WCF——第六天 你必须要了解的3种通信模式

    wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦,单向,请求-响应,双工模式,其中的第二种“请求-响应“ 模式,这个大家不用动脑子都清楚,这一篇我大概来分析下. 一: ...

  3. 优化SqlServer--数据压缩

    数据压缩是对存储和性能优势的加强.减少数据库占用的磁盘空间量将减少整体数据文件存储空间,在一下几个方面增加吞吐量: 1.更好的I/O利用率,每个页面可以读写更多的数据. 2.更好的内存利用率,缓冲区可 ...

  4. mod_PHP&fastcgi

    从宏观上来看,PHP内核的实现与世界上绝大多数的程序一样,接收输入数据, 做相应处理然后输出(返回)结果. 我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算, 最后返回 ...

  5. 今天说一下Top ~

    Top这个关键字,大家都不陌生~尤其是很多时候打开SSMS的时候右键表名,选择前1000行的时候,就可以见到编译出来的语句 Select top 1000 XXX from XXX 好~我们先看看To ...

  6. Android : <com.mobeta.android.dslv.DragSortListView-引用自定义控件包名错误

    所谓的包名与命名空间的问题,包名不一致是指与自己工程的package名称不一置, 开始以为是到自定义包名不一置,真是个误区: 解决方法: 把xmlns:dslv="http://schema ...

  7. Eclipse 无线调试(利用ADB工具)

    首先:1.你的手机必髯要有ROOT权限才可以安装ADB工具:2.手机开启WLAN(WIFI): (1)安装ADB工具: (2)添加环境变量PATHA;(我的是ADB路径是:D:\adt-bundle- ...

  8. Semiautomated IMINT Processing Baseline System——翻译

    题目 半自动的IMINT(图像情报)处理基准系统 摘要 SAIP ACTD(半自动图像情报处理高级概念技术展示项目)的目的是,通过战略上的传感器采集,使图像成为指挥官掌控整个战场的主要源头.该采集系统 ...

  9. ArrayList如何实现线程安全

    一:使用synchronized关键字,这个大家应该都很熟悉了,不解释了: 二:使用Collections.synchronizedList();使用方法如下: 假如你创建的代码如下:List< ...

  10. cookie 和 session 的基础知识

    cookie 和 session 的基础知识 cookie 和session 的区别详解 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会 ...