Python中如何下载磁力/电驴/迅雷的资源

刚接触 python 的菜鸟一枚,想写个爬虫批量下载电影,但是用下载图片的方法没办法下载电影了。 求指点~~~ 另外多线程的话应该怎么搞。。。

        for movie in movies:
            print(movie.title)
            resource = urllib.request.urlopen(movie.downloadUrl)
            movieData = open(movie.title, 'wb')
            movieData.write(resource.read())
            movieData.close()

Python中如何下载磁力/电驴/迅雷的资源

38 回复

我觉得你后台跑个 aria2 把链接用 rpc 添加任务得了……


对于下载磁力/电驴/迅雷资源,Python有几个常用库可以处理。最推荐的是libtorrent,它功能强大且支持多种协议。

首先安装依赖:

pip install libtorrent

这里是一个完整的磁力链接下载示例:

import libtorrent as lt
import time

def download_magnet(magnet_link, save_path='./downloads'):
    # 创建会话
    ses = lt.session()
    ses.listen_on(6881, 6891)
    
    # 添加磁力链接
    params = {
        'save_path': save_path,
        'storage_mode': lt.storage_mode_t.storage_mode_sparse
    }
    
    handle = lt.add_magnet_uri(ses, magnet_link, params)
    
    print(f"开始下载: {handle.name()}")
    
    # 等待元数据下载完成
    while not handle.has_metadata():
        time.sleep(1)
    
    # 开始下载
    handle.set_priority(lt.priority_t.highest)
    
    # 监控下载进度
    while handle.status().state != lt.torrent_status.seeding:
        s = handle.status()
        print(f'进度: {s.progress * 100:.2f}% | 速度: {s.download_rate / 1000:.1f} kB/s')
        time.sleep(5)
    
    print("下载完成!")

# 使用示例
magnet = "magnet:?xt=urn:btih:你的磁力链接哈希值"
download_magnet(magnet)

对于电驴链接,可以使用pylibed2k

import pylibed2k

def download_ed2k(ed2k_link, save_path='./downloads'):
    client = pylibed2k.Client()
    client.connect()
    
    # 添加下载任务
    task = client.add_task(ed2k_link, save_path)
    
    # 监控进度
    while not task.is_complete():
        print(f"进度: {task.progress * 100:.2f}%")
        time.sleep(5)
    
    client.disconnect()

迅雷链接需要先转换为普通链接,可以使用thunder库:

import base64

def thunder_to_url(thunder_link):
    # 移除thunder://前缀并解码
    encoded = thunder_link[10:]  # 去掉"thunder://"
    decoded = base64.b64decode(encoded).decode('utf-8')
    # 移除AA和ZZ包裹
    return decoded[2:-2]

# 使用示例
thunder = "thunder://QUFodHRwOi8vZXhhbXBsZS5jb20vZmlsZS56aXBaWg=="
real_url = thunder_to_url(thunder)
# 然后用requests或wget下载real_url

几个关键点:

  1. libtorrent需要系统安装boost库
  2. 电驴协议现在资源较少
  3. 迅雷链接本质是base64编码的普通URL

建议优先使用libtorrent处理磁力链接。

你这么个问法我觉得磁力和电驴你要自己写完实现是不大可能了。。直接调用其他下载工具吧

有多大硬盘存?那些爬虫站一般也就存个链接吧。

磁力链的话好办,直接调用 transmission (或者 arias)下载就可以了。
电驴,不知道,你可以看看 amule 什么的客户端有没有什么 API
迅雷,喵喵喵~~~

另外,多线程,一头雾水。
本来便是 p2p,没有固定的资源,不存在多不多线程的问题。

磁链和电驴都能直接 aria2,迅雷的链接需要解码成 http/ftp 链接再交给 aria2

aria 有 JSONRPC ( HTTP ) 接口

#5 搞错了,aria2 不支持 ed2k,ed2k 你得试试能不能用 amule 之类的

aria2 没弄过,我去找找,thx ~

#2,哈哈,这不是以为 python 是万能的。。。

#3 下一个网页里的电影就够了。。。SSD 太贵了。。。

#4 vely 详细,thx,我琢磨琢磨

#8 如果你愿意自己实现,任何一门语言都能接入任何一个 p2p 网络,反正 protocol 都是开放标准。

是这样,磁力( BT )和电驴是两种不同的 P2P 下载协议,不像 HTTP 协议那样你一句就能拉下来,你得用 Python 分别实现两种协议的客户端才行

看你帖子的内容感觉对俩协议都一无所知,感觉你真写不出来两个完整的客户端实现

Python 可以万能,但你不是万能的啊老铁

要不是大家提醒你差点写出个下载软件来

如果不是一些奇怪的视频,就用 you-get 下载吧

这种时候,你只需要遵循 KISS 原则就好了,有现成的东西当然就是拿来用咯

很多 sdk 的

BT 开源实现比较多,比如 libtorrent 库 http://www.libtorrent.org/python_binding.html
emule 只能用客服端了,emule/amule/MLDonkey.
迅雷死链的话只能用它家离线。

我进来前以为是个大牛…

#11 我是很愿意,可惜没能力。。。

#12 尽管有点扎心,但是不会的才要学

vely sorry,让您失望了,sigh

我下载图片都是直接 os.system(‘aria2c xxx’) 是不是太弱了

是 very。
而且没有 very sorry 的说法,只有 really sorry

迅雷有添加任务的 API

vely 可能是印度人的口音……

下载图片不如 wget -i

你是认真的?

You get it!

#24 python 可以用吗?没见官方给出 demo

#26 很强大。thx ~

还是调用第三方软件吧省心

可以把添加任务的 VBS 代码写入一个 .vbs 文件,然后用 Python 执行这个文件。

#32 vbs? 额。。。新东西。。。

参考一下 Sonarr 的设计吧

非要 Python 的话,去看一下 Sick Beard

#35 thx,我试试

大佬能详细说下吗?试了 1 天没搞定。。。

回到顶部