python爬虫网络库下载_Python3 DHT 网络磁力种子爬虫

Python3 DHT 网络磁力种子采集器

😎 严肃的理论

磁力链接

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

磁力定义

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

种子结构

.torrent 种子文件本质上是文本文件,包含 Tracker 信息和文件信息两部分。Tracker 信息主要是 BT 下载中需要用到的 Tracker 服务器的地址和针对 Tracker 服务器的设置,文件信息是根据对目标文件的计算生成的,计算结果根据 BitTorrent 协议内的 Bencode 规则进行编码。它的主要原理是需要把提供下载的文件虚拟分成大小相等的块,块大小必须为2k的整数次方(由于是虚拟分块,硬盘上并不产生各个块文件),并把每个块的索引信息和 Hash 验证码写入种子文件中;所以,种子文件就是被下载文件的“索引”。

种子-磁力联系

磁力链接的唯一标识符就是 40 个 16 进制字符码,也就是 magnet:?xt=urn:btih:E7FC73D9E20697C6C440203F5884EF52F9E4BD28 中的 E7FC73D9E20697C6C440203F5884EF52F9E4BD28。这个同时也是种子文件的 info_hash,是每个种子的唯一标识码。根据它就能将磁力链接于种子联系起来,得到资源的详细信息,进而下载资源。

DHT

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 之后。

当然最后还是给码出来了啦

项目结构

核心代码

从 DHT 网络中获取磁力链接。主要是利用一些大型的服务器 tracker,冒充 DHT 节点,使用 UDP 协议加入到 DHT 网络中搜索一波以及和其他节点搞好关系,让他们也分享我点资源。

磁力数据存放在了 redis,利用 redis 的集合特性来去重。使用了多线程/多进程,用于提高爬取效率。在我的本地机器(i7-7700HQ/16G 内存/8M 网速)跑了一下,效果还不错。

运行效果

查看 redis 磁链数量

$ redis-cli

127.0.0.1:6379> scard magnets

(integer) 1151256

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

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

最后兜兜转转用到了 aria2 发现效率还可以。但是要先把 aria2 安装到你的 PATH 中,具体参考官网介绍。使用其 RPC 特性,节省线程开销。

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

有图有真相

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

辅助代码

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

如何使用

获取源码及安装依赖环境

确保已经安装好 redis,redis 的具体配置可以在 database.py 里面修改

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

$ cd magnet-dht

$ pip install -r requirements.txt

运行项目

进程数量可以在 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

Note: 在运行 python manage.py -m 的时候,要先开个终端窗口启动 aria2c 服务。

$ aria2c --enable-rpc=true --bt-metadata-only=true --bt-save-metadata=true

😃 深刻的感悟

自我接触编程以来,我一直都是属于兴趣驱动的,对某种技术感兴趣的话就会花时间去研究去尝试。想成为一个有趣的人,去做一些有趣的事。

真心觉得能把脑海里的想法转变为代码实现是件很棒的事,即使可能这件事在别人看来并没有什么了不起。技术发展变化总是那么快,不紧跟着可能不小心就掉队了。所以希望每个真心热爱编程的人都能不忘初心,永远保持对新技术的热情,永远能从编码中找到乐趣。

License

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgresql修炼之道_PostgreSQL的TOAST技术

本文参考:PostgreSQL TOAST 技术理解《PostgreSQL修炼之道》一、TOAST是什么?TOAST是“The Oversized-Attribute Storage Technique”(超尺寸属性存储技术)的缩写,主要用于存储一个大字段的值。要理解TOAST&#xff0c…

3D器官和骨骼将使移植清单成为历史

来源:IEEE电气电子工程师学会对于患有慢性病或病情危重的患者,等待器官移植匹配的时间可能对生命生死攸关。根据美国卫生资源和服务管理局(Health Resources and Services Administration:https://www.organdonor.gov/statistics-…

11月25号站立会议

小组名称:飞天小女警 项目名称:礼物挑选小工具 小组成员:沈柏杉(组长)、程媛媛、杨钰宁、谭力铭 代码地址:HTTPS: https://git.coding.net/shenbaishan/GIFT.git SSH:gitgit.coding.net:shenbai…

linux 键盘过滤,linux – 需要拦截HID Keyboard事件(然后阻止它们)

我有一个RFID USB设备,注册为HID设备(A USB键盘或多或少).我正在寻找一种方法来捕获此输入,并在它碰到普通键盘事件处理程序(并将10位数的RFID代码输出到控制台)之前对其进行阻塞/过滤.我当然必须专门捕获这个设备,并且将真正的键盘输入单独留下(或传递给它).我最初的想法是在U…

鱼c论坛python课后作业_三日速成python?打工人,小心钱包,别当韭菜

随着人工智能的热度越来越高,许多非计算机专业的同学们也都纷纷投入到学习编程的道路上来。而Python,作为一种相对比较容易上手的语言,也越来越受欢迎。网络上各类网课层出不穷,各式广告令人眼花缭乱。某些课程甚至卖出“天价”&a…

Linux shell的输入输出

echo --echo命令可以显示文本行或变量,或者把字符串输入到文件 --echo [option] string-e 解析转义字符 例如:echo -e "nimenhao\nasfdsaf" 打印发生换行-n 回车不换行 详解:一般在命令行打印字符串,光标会…

区块链共识算法的发展现状与展望

来源:平行区块链摘 要 共识算法是区块链技术的核心要素, 也是近年来分布式系统研究的热点. 本文系统性地梳理和讨论了区块链发展过程中的 32 种重要共识算法, 介绍了传统分布式一致性算法以及分布式共识领域的里程碑式的重要研究和结论, 提出了区块链共识算法的一种…

python预测发展趋势_Python中的趋势“预测器”?

对于预测时间序列数据,我觉得最好的选择是LSTM,它是一种递归神经网络,非常适合于时间序列回归。在如果您不想深入研究神经网络的后端,我建议您使用Keras库,它是Tensorflow框架的包装器。在假设你有一个一维数组&#x…

iphone打字怎么换行_iPhone电池保养指南

虽然手机电池的使用寿命会随着用户的日常使用慢慢减少、但需要注意的是、一些不恰当的操作方法,会导致电池寿命快速下降。这时候会有人说,那我可以换电池呀虽然换电池之后,一开始确实还可以,但是随着不恰当的使用,又开…

vc2017 linux printf,C/C++中自定义信息输出——printf与宏的配合使用

在C/C中,提起“宏”多少有些皱眉,至少我在入门C时旁人好心提醒:尽可能地使用typedef与const常量定义来替代“宏”的使用:1. 类型宏定义#define HANLE void*//可以替换为:typedef void *HANLE;2. 常量定义#define MAX_L…

SVN需要忽略的文件类型

自己在用的,有问题的话欢迎指正,直接复制粘贴即可。(一般人我都不告诉他) *.lo,*.la,*.al,*.so,*.so.[0-9]*,*.pyc,*.pyo,*.rej,.*.swp,.DS_Store,*.xcscmblueprint,xcuserdata,*.xcuserdatad,*.xcuserstate,*.xcuserdata,xcschem…

这是我看过,最好懂的神经网络

来源:图灵教育猜一猜,下图中是什么动物?图1 看图猜动物尽管图中的动物胖得出奇,你也应该能够猜到它是一只长颈鹿。人类的大脑拥有强大的辨识能力,它是一个由差不多 800 亿个神经元组成的复杂网络。即使某物并非我们熟知…

python atm作业详解_Python学习day5作业-ATM和购物商城

Python学习day5作业Python学习day5作业ATM和购物商城作业需求ATM:指定最大透支额度可取款定期还款(每月指定日期还款,如15号)可存款定期出账单支持多用户登陆,用户间转帐支持多用户管理员可添加账户、指定用户额度、冻结用户等购物车&#xf…

linux咋socket编程,linux中socket编程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼客户端:include #include #include #include #include #include #include #include #include #define SERVPORT 1234#define MAXDATASIZE 1000 /**/ int main(int argc, char *argv[]){int sockfd, recvbytes;int clien…

redis 简单应用

Incr $views Redis::incr(views); $article_views Redis::incr(article: . $article_id . :views); zIncrBy 有序集合 Sorted sets public function set($id){Redis::zIncrBy(articleViews, 1, article:.$id);}public function get(){$hots Redis::zRevRange(articleViews…

上位机软件用什么写的_python7天训练营 | 为什么大家都开始用python写论文了?...

谈及保研,“内卷”被大家吵得沸沸扬扬。但其实,不仅是夏令营申请竞争、推免资格评比等环节,就连最基本的论文,也开始卷了起来。就以大家最常写的实证类论文为例:前两年,很多社科和经管的学科,夏…

美国如何发展脑科技

来源:蓝海长青智库作者:王小理、韩雪、薛淮大脑是理解自然和人类本身的“终极疆域”,脑科技是科研领域“皇冠上的明珠”。相比欧洲“人类脑计划”的迟缓,美国“推进创新神经技术脑研究计划”(BRAIN)进展颇为…

python 类初始化参数校验_如何规避python参数的初始化次数?

我们在内存不足的时候,除了增加内存的可用度,可以进行一个清理内存的初始化操作,当然这种是最后迫不得已的选择。我们在python中也有需要用到初始化的地方,鉴于参数和函数的关系密不可分,本篇我们会简单的说一下参数的…

spring版本 jdk8_从JDK8升级到JDK11,看这篇就足够了

原文地址:https://blog.codefx.org/java/java-11-migration-guide/。 在原文的基础上,增加了一些我遇到的具体的坑还有在特定场景下的解决方案,供大家参考一些背景在背景知识,我们会讨论一些关于新的JDK Release周期,O…

关于mysql ERROR 1045 (28000)错误的解决办法

错误情景: 使用Navicat打开mysql的时候弹出错误框 错误代码: ERROR 1045 (28000): Access denied for user ODBClocalhost (using password: NO) ERROR 1045 (28000): Access denied for user ODBClocalhost (using password: YES) 解决步骤: 1.找到配置文件my.ini &#xff0…