严肃的理论

磁力链接

现在我们使用迅雷等工具下载资源的时候,基本上都只需要一个叫做磁力链接的东西就可以了,非常方便。

磁力链接是对等网络中进行信息检索和下载文档的电脑程序。和基于“位置”连接的统一资源定位符不同,磁力链接是基于元数据文件内容,属于统一资源名称。也就是说,磁力链接不基于文档的 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)。

这里可以阅读阮一峰的 BT 下载的未来,我很喜欢他文章的最后一句话。

当互联网上每一台机器都在自动交换信息的时候,谎言和封锁又能持续多久呢?

种子/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 就是一个从资源网站上爬取磁力信息的工具。

赶紧上车

然而我

渴望进步

想自给自足获取磁力种子,Google 了一番,发现大家基本上的代码都是从 simDHT 这个项目来的,首先这个项目很棒,但是有个问题就是代码实现细节基本没有一行注释且不兼容 Python3。而很多网上同类的代码基本上也是对这个照搬....

眉头一皱

所以我知道我要开始干活了

努力干活

经过一波 happy coding 之后。

开开心心写代码

项目结构

核心代码

  • crawler.py

从 DHT 网络中获取磁力链接。主要是利用一些大型的服务器 tracker,冒充 DHT 节点,使用 UDP 协议加入到 DHT 网络中一波搜索以及和其他节点搞好关系,让他们也分享我点资源。磁力数据存放在了 redis,利用 redis 的集合特性来去重。使用了多线程/多进程,用于提高爬取效率。在我的本地机器(i7-7700HQ/16G 内存/8M 网速)跑了一下,效果还不错,4 小时爬了 100 万条磁力链接。

$ redis-cli
127.0.0.1:6379> scard magnets
(integer) 1137627

然后代码推送到我那台性能强悍 1 核/2G 内存/1M 网速阿里云服务器跑一下,哎....

  • magnet_to_torrent_aria2c.py

利用 aria2 将磁力链接转换为种子文件。尝试了一些其他的方式将磁力转换为种子,但效果好像都不怎么理想。使用过 libtorrent 的 Python 版本,不知道是我打开方式不对还是它本来效率就不高,反正愣是一个种子都没有转换成功。

最后兜兜转转用到了 aria2 发现效率还可以。这里利用多线程跑一个命令。所以要先把 aria2 安装到你的 PATH 中,具体参考官网介绍。

  • parse_torrent.py

解析种子文件内容,同样也是利用了 bencoder 进行解码。有了种子我们当然要看看到底是些什么资源了啦。你说世界就是这么小,在我解析出来的几百个种子文件中,居然有几个都是一个社区的,那个以 1024 为标志的社区。

有图有真相

知乎社区

不过我还是希望大家铭记下面这 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 -h
usage: 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

深刻的感悟

自我学编程以来,我一直都是属于兴趣驱动的,对某种技术感兴趣的话就会花时间去研究去尝试。想成为一个有趣的人,去做一些有趣的事,真心觉得能把脑海里的想法转变为代码实现是件很棒的事,即使可能这件事在别人看来并没有什么了不起。技术发展变化总是那么快,不紧跟着可能不小心就掉队了。所以希望每个真心热爱编程的人都能不忘初心,永远保持对新技术的热情,永远能从编码中找到乐趣。

项目地址

https://github.com/chenjiandongx/magnet-dht

严肃讨论:如何自给自足获取自主学习磁力种子?相关推荐

  1. Windows系统win10系统磁力种子文件下载软件推荐

    描述:Windows系统win10系统磁力种子文件下载软件推荐 名称: 比特彗星

  2. 从0获取10万种子用户实操全流程

    写在前面:产品运营从0到1(实操篇):如何获取种子用户的系列文章,主要是针对产品.人群.渠道.文案.活动.优化六个方面来写. 至于为什么先写实操篇: 1.实操篇难写而且累,没有真正主导.经历过的人很难 ...

  3. Android调用磁力传感器,获取当前磁力值

    Android对于磁力传感器的具体写法,在网上很难找到,下面自己写了一个粒子: 首先是权限: <uses-feature android:name="Android.hardware. ...

  4. 磁力链接转换为种子文件 magnet to torrent

    作者:zxx 1.前言 将种子文件转换为磁力链接很简单,只需要在种子文件的infohash码前面加上magnet:?xt=urn:btih:即可,相信大家在迅雷,utorrent等主流软件上也都能发现 ...

  5. 创业初期获取种子用户的7种方法

    说到推广,估计很多人想起来的第一步就是该怎么推广,从那里入手?高手们呢,由于推广经验比较多,一般是轻车熟路,有自己的一套思路,而刚入门的呢,估计就会很费劲,临时抱佛脚有时候也不知道该从哪里入手,会比较 ...

  6. 磁力连接是如何接入DHT网络并下载文件的

    你的bt客户端连接到的第一个ip(除DNS外)提供一个公网ip的列表,这些ip被用来当作DHT网络的入口.这个列表一般由制作bt客户端的人来提供. 当你接入DHT网络之后,你会通过DHT查询找到更多的 ...

  7. 下载磁力链接的软件推荐

    原文章: https://www.52pojie.cn/thread-1332540-1-1.html [Windows] 磁力种子下载神器 qBittorrentEE_v4.3.1.11[qBitt ...

  8. 【JAVA】从0开始写DHT/磁力爬虫 01 序章

    前段时间空闲时间比较多,又迫于想看的美剧找不到合适的资源,于是萌生了为何不自己实现一个DHT爬虫来获取磁力/种子资源搭建一个属于自己的文件索引库呢? 说做就做,要想做磁力爬虫就要先了解一下什么是DHT ...

  9. 一篇文章教会你利用Python网络爬虫获取Mikan动漫资源

    [一.项目背景] [蜜柑计划 - Mikan Project] :新一代的动漫下载站.是一个专门为喜欢动漫的小伙伴们打造的动漫视频在线播放网站,为大家第一时间分享最新动漫资源,每日精选最优质的动漫推荐 ...

  10. 功夫熊孟军贤:如何拿到10万种子用户,创业的经验分享

    分享嘉宾:孟军贤,功夫熊联合创始人&COO,前百度视频检索端产品经理,大学创办外卖久久网,13年底离职创业,前两款产品分别为青果记账.有闲,2014年10月上线o2o产品功夫熊.目前已经获得天 ...

最新文章

  1. SQL SERVER中带参数的返回
  2. 组合特征(五)countvector(w)+doc(w)+hash(w)
  3. Android之如何优雅的管理ActionBar
  4. redis基本操作和在springboot中的使用
  5. tp5 ajax 路由,tp5中ajax方式提交表单
  6. myeclipse问题
  7. 什么是I帧,P帧,B帧
  8. 使用plsql创建oracle,在Oracle下使用PLSQL Developer创建简单的触发器
  9. Table边框使用总结
  10. 重置gitlab管理员密码
  11. QTP连接sqlserver
  12. android so导致启动慢,谈谈Android NDK中动态链接库(.so文件)的优化
  13. Android -- Camera.ShutterCallback
  14. 002,jvm启动流程
  15. *第八周*数据结构实践项目二【建设链串算法库】
  16. Ubuntu中将otf字体转换为ttf字体
  17. [Day 1]上海CNUTCon全球运维技术大会2017实录
  18. allure用例定制参数及报告效果展示
  19. java实现银行卡卡号 Luhm 校验算法
  20. NTFS与FAT32区别

热门文章

  1. 计算机显示器分辨率,现在电脑的主流显示器的分辨率一般是多大?
  2. 【朝花夕拾】Lint篇
  3. 神奇的三门问题,到底换不换门
  4. nepctf pwn easystack(_stack_chk_fail)
  5. 技术脱盲贴1------WINPE手工制作
  6. keepalived 中关于 weight 和 preempt_delay 的实验
  7. android模拟器字体,真正免root的ifont字体软件详细使用教程
  8. 怎么做一个有价值的人
  9. Tensorflow系列——Saver的用法
  10. Java xml格式化工具