我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用Python获取磁力种子

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用Python获取磁力种子

陈键冬,Python中文社区专栏作者,pyecharts开源项目核心开发者,github id:chenjiandongx

本文项目地址:github.com/chenjiandongx/magnet-dht

磁力链接

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

640?wx_fmt=jpeg

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

通过磁力就可以获取种子文件从而进行下载,这跟直接使用种子下载时一个道理的,只是少了从磁力到种子文件的一个过程而已。

640?wx_fmt=jpeg

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 协议 的具体内容,这里有 中文翻译版本。(想要彻底读懂项目的话一定要先了解该协议,代码都是基于该协议实现的)

640?wx_fmt=gif

务实的实践

项目来源 

一般来讲到 Python 爬取,大家的第一印象可能就是 requests/aiohttp,或者是 scrapy/pyspider 等爬虫框架。基本上都是从指定的 HTML 页面爬取信息。我有一个项目 torrent-cli(github.com/chenjiandongx/torrent-cli) 就是一个从资源网站上爬取磁力信息的工具。

640?wx_fmt=jpeg

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

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

640?wx_fmt=gif

经过一波 happy coding 之后

640?wx_fmt=gif

项目结构

核心代码

  • crawler.py

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

  1. $ redis-cli

  2. 127.0.0.1:6379> scard magnets

  3. (integer) 1137627

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

640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg

有图有真相

640?wx_fmt=jpeg

不过我还是希望大家铭记下面这 24 字箴言

640?wx_fmt=jpeg

辅助代码

  • database.py:封装了关于 redis 的数据操作,主要是利用其集合数据结构。

  • utils.py:一些工具函数

如何使用

获取源码及安装依赖环境

  1. $ git clone https://github.com/chenjiandongx/magnet-dht.git

  2. $ cd magnet-dht

  3. $ pip install -r requirements.txt# 确保已经安装好 redis,redis 的具体配置可以在 database.py 里面修改。

运行项目

  1. # 至于进程数量可以在 crawler.py 进行调整$ python manage.py -h

  2. usage: manage.py [-h] [-s] [-m] [-p]

  3. start manage.py with flag.

  4. optional arguments:

  5.  -h, --help  show this help message and exit  -s          run start_server func.

  6.  -m          run magnet2torrent func

  7.  -p          run parse_torrent func

深刻的感悟

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

640?wx_fmt=png

640?wx_fmt=gif

Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以公安部、工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。

640?wx_fmt=jpeg

▼ 点击下方阅读原文免费成为社区会员

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

用Python获取磁力种子

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

用Python获取磁力种子

♚陈键冬,Python中文社区专栏作者,pyecharts开源项目核心开发者,github id:chenjiandongx本文项目地址:github.com/chenjiandongx/magnet-dht磁力链接现在我们使用迅雷等工具下
2023-01-31

使用Python实现BT种子和磁力链接的相互转换

bt种子文件转换为磁力链接 BT种子文件相对磁力链来说存储不方便,而且在网站上存放BT文件容易引起版权纠纷,而磁力链相对来说则风险小一些。而且很多论坛或者网站限制了文件上传的类型,分享一个BT种子还需要改文件后缀或者压缩一次,其他人需要下载
2022-06-04

linux平台使用Python制作BT种子并获取BT种子信息的方法

本文实例讲述了linux平台使用Python制作BT种子并获取BT种子信息的方法。分享给大家供大家参考,具体如下: 最近研究了一下linux BT服务器环境的搭建,需要在linux下制作BT种子并获取BT种子信息,整理了一下这个过程: 制作
2022-06-04

Linux使用Aria2命令下载BT种子/磁力/直链文件

文章目录 安装BT下载使用aria2c -S 009.torrent 列出种子内容aria2c xxx.torrnet 限速下载多线程下载功能 安装 yum install aria2 BT下载使用 aria2c -
2023-08-22

python如何获取子列表

小编给大家分享一下python如何获取子列表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!获取子列表x = [1,2,3,4,5,6]#前3个print x[:3
2023-06-17

Java获取磁盘空间的两种代码示例

本文分享了两段获取磁盘空间的代码,参考下。代码1:import java.io.File;public class DiskSpaceDetail {public static void main(String[] args) {File
2023-05-30

Python 获取磁盘信息的脚本及常用文

文件是否存在os.path.exists(save_to_path+ '/0.png'):删除os.remove(save_to_path + '/0.png')当前运行的脚本位置run_path = os.path.split(os.pa
2023-01-31

Android开发获取重力加速度和磁场强度的方法

本文实例讲述了Android开发获取重力加速度和磁场强度的方法。分享给大家供大家参考,具体如下:Android获取重力加速度和磁场强度主要依靠:Sensor.getRotationMatrix (float[] R, float[] I,
2023-05-30

python获取公网ip的几种方式

from urllib2 import urlopenmy_ip = urlopen('http://ip.42.pl/raw').read()print 'ip.42.pl', my_ipfrom json import loadfrom
2023-01-31

Python获取当前路径3种方法

本文主要介绍了Python获取当前路径3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-31

python如何获取目录下所有子目录

Python可以使用os模块来获取目录下的所有子目录。方法一:使用os.walk()函数os.walk()函数可以遍历指定目录下的所有子目录和文件。它返回一个生成器,生成器的每个元素是一个包含三个元素的元组,分别是当前目录路径、当前目录下的
2023-09-27

python如何通过psutil获取服务器cpu、内存、磁盘使用率

这篇文章主要介绍了python通过psutil获取服务器cpu,内存,磁盘使用率,使用psutil,可以很方便地监控系统的运行状况,诊断问题和优化性能,需要的朋友可以参考下
2023-05-17

python获取多线程及子线程的返回值

最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装import threading class MyThread(threading.Thread):def __init
2022-06-04

python获取linux系统信息的三种方法

方法一:psutil模块#!usr/bin/env python # -*- coding: utf-8 -*-import socket import psutil class NodeResource(object):def get_h
2022-06-04

Python中parsel两种获取数据方式小结

本文主要介绍了Python中parsel两种获取数据方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录