python下载磁力链,
来源:Python中文社区
ID:python-china
磁力链接
现在我们用迅雷等工具下载资源的时候,基本上只需要一个叫磁链接的东西,非常方便。
Magnetic link是一个用于对等网络中信息检索和文件下载的计算机程序。与基于“位置”连接的统一资源定位符不同,磁链接基于元数据文件内容,属于统一资源名称。也就是说,磁链接不是基于文档的IP地址或定位符,而是在分布式数据库中,通过哈希函数值对文档进行识别和搜索来下载。因为它不依赖于启动主机来下载文档,所以它特别适合于没有中心服务器的对等网络。
磁性链接格式类似于:
磁铁:XT=urn:btih:e7fc 73 d9 e 20697 c6c 440203 f 5884 ef 52 f 9 E4 BD 28
分解这个链接。
磁体:协议名称。
XT:exact topic的缩写,代表资源锚点。BTIH(BitTorrent信息哈希)表示哈希方法名称。这里也可以使用SHA1和MD5。这个值是文件的标识符,是必不可少的。
一般来说,一个磁链只需要以上两个参数就可以找到唯一对应的资源。还有其他可选参数提供更详细的信息。
DN:显示名称的缩写,表示向用户显示的文件名。
TR:tracker的缩写,表示tracker服务器的地址。
Kt: Keywords,更一般的搜索,指定搜索关键字而不是特定文件。
Mt:文件列表,链接到包含磁性链接的元文件(MAGMA-MAGnet MAnifest)。
种子/DHT
可以通过磁力获取种子文件并下载,和直接使用种子下载是一样的,只是省略了一个从磁力到种子文件的过程。
BitTorrent协议的种子文件可以保存一组文件的元数据。该格式文件由BitTorrent协议定义。分机一般是”。洪流”。BitTorrent使用分布式哈希表(DHT)来存储tracker torrents对等点之间的联系信息。所以每个同伴都变成了追踪者。该协议基于Kademila网络,在UDP上实现。
DHT由节点组成,节点存储对等体的位置。BitTorrent客户端包含一个DHT节点,用来联系DHT中的其他节点获取peer的位置,然后通过BitTorrent协议下载。
对等:在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不兼容。而很多类似的网上代码基本都是抄袭这个的。
所以我知道我必须开始工作。
经过一波快乐的编码
项目结构
核心代码
爬虫. py
从DHT网络获取磁性链接。主要是利用一些大型服务器tracker,伪装成DHT节点,使用UDP协议加入DHT网络的一波搜索,和其他节点搞好关系,让他们也可以共享我的资源。磁力存储在redis中,利用redis的收集特性去重。采用多线程/多进程提高抓取效率。我在本地机(i7-7700HQ/16G内存/8M网速)上运行过,效果还不错。我在4小时内爬了100万个磁环。
$ redis-CLI 127 . 0 . 0 . 1:6379 gt;Scard磁铁(整数)1137627然后代码被推送到我强大的1核/2G内存/1M网速阿里云服务器上运行,哎!
Magnettotorrent_aria2c.py使用aria2将磁性链接转换为种子文件。我尝试了一些其他的方法把磁力转化成种子,结果好像不太理想。用了Python版的libtorrent,不知道是我打开方式不对,还是效率不高。反正没有一个种子转化成功。
最后用aria2走了一圈,发现效率还可以。这里,使用多线程来运行命令。所以先把aria2安装到你的路径中,请参考官网的介绍。
Parse_torrent.py解析种子文件的内容,该文件也是使用bencoder解码的。有了种子,当然要看资源是什么。都说你的世界好小。在我分析的数百个种子文件中,有几个实际上来自标记为2的10次方的社区。
有图有真相。
但是我还是希望你记住下面的24条谚语。
辅助代码
Database.py:封装了关于redis的数据操作,主要利用其聚合数据结构。
Utils.py:一些实用函数
如何使用
获取源代码并安装相关环境
$ git clone https://github.com/chenjiandongx/magnet-dht.git$ CD Magnet-DHT $ pipi install-r requirements . txt #确保已经安装了redis,并且可以在database.py运行项目中修改redis的具体配置
#至于进程数,可以在crawler.py $ pythonmanage.py-h中调整用法:manage . py[-h][-s][-m][-p]start manage . py with flag。可选参数:-h,- help显示此帮助消息并退出-s run start_server func。-m运行magnet2torrent func -p运行parse_torrent func深刻的感悟
自从我学会了自我编程,我一直都是兴趣驱动的。如果我对某项技术感兴趣,我会花时间去研究和尝试。我想成为一个有趣的人,做一些有趣的事。我真的觉得把自己脑子里的想法变成代码实现是一件很棒的事情,即使在别人看来可能不是很棒的事情。技术的变化总是那么快,如果不紧跟,一不小心就可能落后。所以,我希望每一个真正热爱编程的人,都能不忘你的主动头脑,永远保持对新技术的热情,永远在编码中找到乐趣。
陈建东,Python中文社区专栏作家,pyecharts开源项目核心开发者,github id:chenjiandongx
本文地址:github.com/chenjiandongx/magnet-dht
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。