磁钢棒
现在我们用迅雷等工具下载资源的时候,基本上只需要一个叫磁链接的东西,非常方便。
Magnetic link是一个用于对等网络中信息检索和文件下载的计算机程序。与基于“位置”连接的统一资源定位符不同,磁链接基于元数据文件内容,属于统一资源名称。也就是说,磁链接不是基于文档的IP地址或定位符,而是在分布式数据库中,通过哈希函数值对文档进行识别和搜索来下载。因为它不依赖于启动主机来下载文档,所以它特别适合于没有中心服务器的对等网络。
磁性链接格式类似于:
磁铁:?XT = urn:btih:e7fc 73 d9 e 20697 c6c 440203 f 5884 ef 52 f 9 E4 BD 28
分解这个链接。
***gnet:协议名。xt:exact topic 的缩写,表示资源定位点。BTIH(BitTorrent Info Hash)表示哈希方法名,这里还可以使用 SHA1 和 MD5。这个值是文件的标识符,是不可缺少的。
一般来说,一个磁链只需要以上两个参数就可以找到唯一对应的资源。还有其他可选参数提供更详细的信息。
dn:display name 的缩写,表示向用户显示的文件名。tr:tracker 的缩写,表示 tracker 服务器的地址。kt: 关键字,更笼统的搜索,指定搜索关键字而不是特定文件。mt:文件列表,链接到一个包含磁力链接的元文件 (MAGMA - MAGnet MAnifest)。
种子/DHT
可以通过磁力获取种子文件并下载,和直接使用种子下载是一样的,只是省略了一个从磁力到种子文件的过程。
BitTorrent协议的种子文件可以保存一组文件的元数据。该格式文件由BitTorrent协议定义。分机一般是”。洪流”。BitTorrent使用分布式哈希表(DHT)来存储tracker torrents对等点之间的联系信息。所以每个同伴都变成了定位者。该协议基于Kademila网络,在UDP上实现。
DHT由节点组成,节点存储对等体的位置。BitTorrent客户端包含一个DHT节点,用来联系DHT中的其他节点获取peer的位置,然后通过BitTorrent协议下载。
peer: 一个 TCP 端口上**的客户端/服务器,它实现了 BitTorrent 协议。节点: 一个 UDP 端口上**的客户端/服务器,它实现了 DHT(分布式哈希表) 协议。 如果对 DHT 协议感兴趣的话一定要看下 DHT 协议 的具体内容,这里有 中文翻译版本。(想要彻底读懂项目的话一定要先了解该协议,代码都是基于该协议实现的)
实用实践
项目源
一般来说,提到Python爬行,你的第一印象可能是requests/aiohttp,或者scrapy/pyspider之类的爬虫框架。基本上都是从指定的HTML页面抓取信息。我有一个项目叫torrent-CLI(github . com/chenjian dongx/torrent-CLI),是一个从资源网站抓取磁性信息的工具。
不过,我想自给自足获得磁种。我谷歌了一下,发现每个人的基本代码都来自SIMD ht(github.com/fanpei91/simDHT)项目。首先这个项目很棒,但是有一个问题就是代码实现细节基本没有注释,和Python3不兼容。而很多类似的网上代码基本都是抄袭这个的。....
所以我知道我必须开始工作。
经过一波快乐的编码
项目结构
核心代码
crawler.py
从DHT网络获取磁性链接。主要是利用一些大型服务器tracker,伪装成DHT节点,使用UDP协议加入DHT网络的一波搜索,和其他节点搞好关系,让他们也可以共享我的资源。磁力存储在redis中,利用redis的收集特性去重。采用多线程/多进程提高抓取效率。我在本地机(i7-7700HQ/16G内存/8M网速)上运行过,效果还不错。我在4小时内爬了100万个磁环。
$ redis-cli127.0.0.1:6379> scard ***gnets(integer) 1137627
然后代码推送到我强大的1核/2G内存/1M网速阿里云服务器上运行,哎!....
***gnettotorrent_aria2c.py 利用 aria2 将磁力链接转换为种子文件。尝试了一些其他的方式将磁力转换为种子,但效果好像都不怎么理想。使用过 libtorrent 的 Python 版本,不知道是我打开方式不对还是它本来效率就不高,反正愣是一个种子都没有转换成功。
最后用aria2走了一圈,发现效率还可以。这里,使用多线程来运行命令。所以先把aria2安装到你的PATH中,请参考官网的介绍。
parse_torrent.py 解析种子文件内容,同样也是利用了 bencoder 进行解码。有了种子我们当然要看看到底是些什么资源了啦。你说世界就是这么小,在我解析出来的几百个种子文件中,居然有几个都是来自那个以 2的10次方为标志的社区。
有图有真相。
但是我还是希望你记住下面的24条谚语。
辅助代码
database.py:封装了关于 redis 的数据操作,主要是利用其***数据结构。utils.py:一些工具函数
如何使用
获取源代码并安装相关环境
$ git clone https://github.com/chenjiandongx/***gnet-dht.git$ cd ***gnet-dht$ pip install -r requirements.txt# 确保已经安装好 redis,redis 的具体配置可以在 database.py 里面修改。
运行项目
# 至于进程数量可以在 crawler.py 进行调整$ python ***nage.py -husage: ***nage.py [-h] [-s] [-m] [-p]start ***nage.py with flag.optional arguments: -h, --help show this help message and exit -s run start_server func. -m run ***gnet2torrent func -p run parse_torrent func
本文来自Total.不想长大投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/618773.html