现在我们利用迅雷等工具下载资源的时候,基本上都只须要一个叫做磁力链接的东西就可以了,非常方便。
有须要Python学习资料的小伙伴吗?
磁力链接是对等网络中进行信息检索和下载文档的电脑程序。和基于“位置”连接的统一资源定位符不同,磁力链接是基于元数据文件内容,属于统一资源名称。也便是说,磁力链接不基于文档的 IP 地址或定位符,而是在分布式数据库中,通过散列函数值来识别、搜索来下载文档。由于不依赖一个处于启动状态的主机来下载文档,以是特殊适用没有中央做事器的对等网络。
磁力链接格式类似于 :
magnet:?xt=urn:btih:E7FC73D9E20697C6C440203F5884EF52F9E4BD28

分解一下这个链接
magnet:协议名。xt:exact topic 的缩写,表示资源定位点。BTIH(BitTorrent Info Hash)表示哈希方法名,这里还可以利用 SHA1 和 MD5。这个值是文件的标识符,是不可短缺的。一样平常来讲,一个磁力链接只须要上面两个参数即可找到唯一对应的资源。也有其他的可选参数供应更加详细的信息。
dn:display name 的缩写,表示向用户显示的文件名。tr:tracker 的缩写,表示 tracker 做事器的地址。kt: 关键字,更笼统的搜索,指定搜索关键字而不是特定文件。mt:文件列表,链接到一个包含磁力链接的元文件 (MAGMA - MAGnet MAnifest)。种子/DHT
通过磁力就可以获取种子文件从而进行下载,这跟直策应用种子下载时一个道理的,只是少了从磁力到种子文件的一个过程而已。
BitTorrent 协议的种子文件可以保存一组文件的元数据。这种格式的文件被 BitTorrent 协议所定义。扩展名一样平常为“.torrent”。BitTorrent 利用”分布式哈希表”(DHT)来为无 tracker 的种子(torrents)存储 peer 之间的联系信息。这样每个 peer 都成了 tracker。这个协议基于 Kademila 网络并且在 UDP 上实现。DHT 由节点组成,它存储了 peer 的位置。BitTorrent 客户端包含一个 DHT 节点,这个节点用来联系 DHT 中其他节点,从而得到 peer 的位置,进而通过 BitTorrent 协议下载。
peer: 一个 TCP 端口上监听的客户端/做事器,它实现了 BitTorrent 协议。节点: 一个 UDP 端口上监听的客户端/做事器,它实现了 DHT(分布式哈希表) 协议。 如果对 DHT 协议感兴趣的话一定要看下 DHT 协议 的详细内容,这里有 中文翻译版本。(想要彻底读懂项目的话一定要先理解该协议,代码都是基于该协议实现的)务实的实践
项目来源
一样平常来讲到 Python 爬取,大家的第一印象可能便是 requests/aiohttp,或者是 scrapy/pyspider 等爬虫框架。基本上都是从指定的 HTML 页面爬取信息。我有一个项目 torrent-cli(github.com/chenjiandongx/torrent-cli) 便是一个从资源网站上爬取磁力信息的工具。
然而我想自给自足获取磁力种子,Google 了一番,创造大家基本上的代码都是从 simDHT(github.com/fanpei91/simDHT)这个项目来的,首先这个项目很棒,但是有个问题便是代码实现细节基本没有一行注释且不兼容 Python3。而很多网上同类的代码基本上也是对这个照搬....
以是我知道我要开始干活了
经由一波 happy coding 之后
项目构造
核心代码
crawler.py从 DHT 网络中获取磁力链接。紧张是利用一些大型的做事器 tracker,伪装 DHT 节点,利用 UDP 协议加入到 DHT 网络中一波搜索以及和其他节点搞好关系,让他们也分享我点资源。磁力数据存放在了 redis,利用 redis 的凑集特性来去重。利用了多线程/多进程,用于提高爬取效率。在我确当地机器(i7-7700HQ/16G 内存/8M 网速)跑了一下,效果还不错,4 小时爬了 100 万条磁力链接。
$ redis-cli127.0.0.1:6379> scard magnets(integer) 1137627
然后代码推送到我那台性能刁悍 1 核/2G 内存/1M 网速阿里云做事器跑一下,哎....
magnettotorrent_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/magnet-dht.git$ cd magnet-dht$ pip install -r requirements.txt# 确保已经安装好 redis,redis 的详细配置可以在 database.py 里面修正。
运行项目
# 至于进程数量可以在 crawler.py 进行调度$ python manage.py -husage: manage.py [-h] [-s] [-m] [-p]start manage.py with flag.optional arguments: -h, --help show this help message and exit -s run start_server func. -m run magnet2torrent func -p run parse_torrent func
有须要Python学习资料的小伙伴吗?小编整理【一套Python资料、源码和PDF】,感兴趣者可以关注小编后私信学习资料(是关注后私信哦)反正闲着也是闲着呢,不如学点东西啦