python-qbittorrent库下载电影学习记录(含基本使用和常用函数)

2023-05-16

        最近因为一些需求,爬了一个带有magnet磁力链接的网站(如果有对怎么爬感兴趣可以说一声,这个文章基本只是为了当成自己的学习记录用哒,也会基于爬完的数据库开始做下一步),大致的结构是每个影片有自己的名字和他人分享的一系列magnet链接,需要批量下载这些磁力链接到本地然后归档。作为一个业余程序员当然不能直接一个一个手动下载了。于是就考虑用python来简化这个工作。

        经过测试发现这一系列magnet中有的是连接不上的(用qbittorrent会一直卡在检索元数据的位置),但是对于同一个影片显然我只需要找到一个可用的资源,也就是获得一个下载最快的magnet就可以。每次进行手动比对、调整保存的路径非常麻烦,于是就通过python-qbittorrent来解决这个问题~

        python-qbittorrent库的pypi和文档都是英文的,这一页的底部点击Read the docs可以直接跳转到官方文档。啃了半天才看懂,基本过程如下:

        首先安装python-qbittorrent库:用经典的pip安装就可以,也可以在pycharm里面找到并安装。

pip install python-qbittorrent

        之后是安装对应系统版本的qbittorrent软件,我写代码用的电脑是mac,所以去搜mac的qbittorrent安装即可,随后需要对软件进行一些设置。

        必要设置:点击qbittorrent上面菜单栏的齿轮,找到首选项里面的Web用户界面,如果需要远程则根据ip地址和服务器域名相应设置,我暂时不需要,则只需要设置下面的本地验证,可以选择账号密码,默认是admin/admin,也可以选择对于本地主机上的客户端跳过验证。

        之后为了个人的功能的实现,在连接选项卡中设置了全局最大连接数和每torrent最大连接数为100。

        使用的时候定义了一个函数如下:

from qbittorrent import Client

def connect_to_qbit():
    qb = Client('http://127.0.0.1:8080/', verify=False)

    qb.login('我的用户名', '我的密码')
    # not required when 'Bypass from localhost' setting is active.
    # defaults to admin:admin.
    # to use defaults, just do qb.login()

    torrents = qb.torrents()
    return qb, torrents

        对于这里的qb和torrents的理解:qb事实上是Client的连接,而torrents是执行torrents=qb.torrents()的时候,qbittorrent客户端内存在的所有任务构成的元组。元组内的每一个元素是一个字典,对应着一个任务的相关信息,个人认为比较关键的信息如下:

字典的key对应的内容信息
size种子对应内容的大小
dlspeed种子的当前下载速度(B为单位)
hash种子的hash值,也就是magnet:?xt=urn:btih:后面的东西
magnet_uri种子的完整magnet
progress种子当前的进度,完成了多少(全部下载完是1)

        另外就是几个比较容易用到的函数:

qb = Client('http://127.0.0.1:8080/', verify=False)
# 连接qb客户端

qb.login('hashiro', '121609103')
# 登陆qb客户端

torrents = qb.torrents()
# 获取任务列表

qb.download_from_link(magnets, savepath=savepath)
# 通过magnet下载,可以传输多个magnet构成的列表,保存在savepath里面,download_from_file是从文件读取magnet。

qb.delete_permanently(hash)
# 通过种子的hash值删除任务以及源文件

qb.delete(hash)
# 通过种子的hash值删除任务

qb.delete_all()
# 删除所有任务

qb.delete_all_permanently()
# 删除所有任务以及源文件

        随后根据我的需求:


import pymysql, time, os, shutil
from qbittorrent import Client

def connect_to_cloud_sql():
    try:
        # 连接数据库
        conn = pymysql.connect(
            host='xxx.xxx.xxx.xxx',
            port=6001,
            user='root',
            password='我的密码',
            db='数据库的名字',
            charset='utf8'
        )
        cur = conn.cursor()
        return conn, cur
    except Exception as e:
        print(e)
        pass

def connect_to_qbit():
    qb = Client('http://127.0.0.1:8080/', verify=False)

    qb.login('我的qb用户名', '我的qb密码')

    # not required when 'Bypass from localhost' setting is active.
    # defaults to admin:admin.
    # to use defaults, just do qb.login()

    torrents = qb.torrents()
    return qb, torrents

def new_dl_symbol():
    torrents = qb.torrents()
    s = 0
    for torrent in torrents:
        s += torrent['dlspeed']
    print('目前下载速度:',s/1000000, 'MB/S')
    if s > 7000000: # 因为我的网速就10MB左右,所以大于7MB了之后就等它下载一会儿,再准备新的种子
        return False
    else:
        return True

class DownloadVideo:
    _path = '保存地址的绝对路径'

    def __init__(self, info_dic):
        self.code = info_dic[0]
        self.name = info_dic[1]
        sql = 'SELECT magnet FROM magnet WHERE code="'+self.code+'"'
        cur.execute(sql)
        self.magnets = [i[0] for i in cur.fetchall()]
        self.magnet_hashs = [magnet[magnet.find('btih:')+5:magnet.find('&')].lower() for magnet in self.magnets]
        self.hashs = []
        self.savepath = self._path + str(self.code) + '/'
        if not os.path.exists(self.savepath):
            os.mkdir(self.savepath)
        self.final_magnet = []

    def download(self):
        if self.magnets == []:
            print('该code没有合适的url!')
            return 3
        qb.download_from_link(self.magnets, savepath=self.savepath)
        print('测试下载速度中……')
        time.sleep(120)
        biggest = 0
        biggest_hash = ''
        self.torrents = qb.torrents()
        for torrent in self.torrents:
            if torrent['hash'] in self.magnet_hashs and biggest < torrent['dlspeed'] and torrent['size'] > 400000000:
                biggest = torrent['dlspeed']
                biggest_hash = torrent['hash']
                self.final_magnet = torrent['magnet_uri']
                self.final_hash = torrent['hash']

        if biggest == 0: # 如果在60秒之内没有发现有下载速度的,就把元数据都找不到的臭弟弟magnet删掉,留下有size的试试
            try_symbol = False
            for torrent in self.torrents:
                if torrent['hash'] in self.magnet_hashs and (torrent['size'] == 0 or try_symbol):
                    qb.delete_permanently(torrent['hash'])
                elif torrent['hash'] in self.magnet_hashs:
                    try_symbol = True
                    if not os.path.exists(self.savepath):
                        os.mkdir(self.savepath)
                    with open(self.savepath + 'log.txt', 'w') as file:
                        file.write('try: '+ torrent['magnet_uri']+'\n')
                    self.final_magnet = torrent['magnet_uri']
                    self.final_hash = torrent['hash']

            if try_symbol:
                print(self.code + ':没有找到有速度的下载数据,写入日志文件……')
                return 1
            else:
                print(self.code + ':没有找到能解析的元数据,写入日志文件……')
                return 2

        for torrent in self.torrents:  # 把比最快的magnet慢的任务都删除
            if torrent['hash'] in self.magnet_hashs and torrent['hash'] != biggest_hash:
                qb.delete_permanently(torrent['hash'])
        if not os.path.exists(self.savepath):
            os.mkdir(self.savepath)
        with open(self.savepath + 'log.txt', 'w') as file:
            file.write(self.final_magnet)
            print('下载magnet:'+self.final_magnet)
        return 0


if __name__ == '__main__':
    nm_path = 'no_mosaic_log/'
    conn, cur = connect_to_cloud_sql()
    qb, torrents = connect_to_qbit()

    sql = 'SELECT code, name, mosaic FROM info WHERE mosaic=0'
    cur.execute(sql)
    result = cur.fetchall()
    print(result)

    dl_list = []
    s = -1
    while s < len(result)-1:
        time.sleep(5)
        if not new_dl_symbol():
            print('下载速度超限!等待完成中……')
            continue
        s += 1
        new_dl = DownloadVideo(result[s])
        dl_list.append(new_dl_av)
        print('---------------------------------第'+str(s+1)+'个文件:'+result[s][0]+'------------------------------')
        print('name:'+ result[s][1])
        with open(DownloadVideo._path+'log.txt', 'a') as logfile:
            code = new_dl.download()
            if code == 0:
                logfile.write('0: ' + result[s][0] + '\n')
            elif code == 1:
                logfile.write('1: ' + result[s][0] + '\n')
            elif code == 2:
                logfile.write('2: ' + result[s][0] + '\n')
            elif code == 3:
                logfile.write('3: ' + result[s][0] + '\n')
        torrents = qb.torrents()


    for torrent in torrents:
        for torrent_info in torrent.keys():
            print(torrent_info, '    ', torrent[torrent_info])
        print('--------------')
    cur.close()
    conn.close()

        代码结构的基本解释:

        首先查询信息数据库,在info的数据库里面获得code,根据code去magnet数据库里面查询需要的磁力链接,若数据库未检索到该code的磁力链接,就将编号3记录在log中。如果此时下载速度低于7MB/s,就将所有磁力链接加入torrent客户端的下载列表,等待两分钟:若已经有magnet有下载速度,就删除其他的任务并记录为0,若没有下载速度,则挑选一个检测到了size(检测到size意味着检测到了元数据)的任务继续,其余删除,记录1。若所有的magnet都没有检测到元数据,就记录2。

        随后观察到了正常运作啦!有小姐姐了~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python-qbittorrent库下载电影学习记录(含基本使用和常用函数) 的相关文章

  • JAVA常用类

    Object类 Object类是类层次结构的根 xff0c 每个类都可以将Object作为超类 所有类都直接或者间接的继承该类 Object只有无参构造方法 Math类 包含执行基本数学运算的方法 Random类 伪随机数 java uta
  • Collections类 [Java]

    Collections工具类 Collections是一个操作Collection集合和Map集合的工具类 Collections不仅仅是操作Collection集合 还可以操作Map集合 Collection和Collections有什么
  • 我阿里P7了解到的Android面试的一些小内幕!已拿offer

    前言 这些题目是网友去百度 小米 乐视 美团 58 猎豹 360 新浪 搜狐等一线互联网公司面试被问到的题目 熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率 欢迎一线公司员工以及网友提交面试题库 xff0c 欢迎留言 网上的都是按
  • 7月编程排行榜来啦!这次有何新变化?

    每月编程排行榜可能会迟到 xff0c 但永远不缺席 7月的编程排行榜已出 xff0c 接下来一起看看有哪些看点吧 Tiobe编程排行榜前20名 Tiobe编程排行榜Top 10趋势 TIOBE Index编程社区指数是编程语言流行度的一个指
  • 操作系统 记录型信号量实现生产者消费者问题(完整代码)

    问题描述 用信号量模拟生产者 消费者问题的过程 生产者和消费者两个线程共享同一个缓冲区 xff0c 生产者不断向缓冲区中添加产品 xff0c 消费者从缓冲区中消费产品 要保证缓冲区满了之后生产者不能再继续添加产品 xff0c 需要等消费者至
  • 制版经验分享—使用AD18

    文章目录 前言一 封装二 走线三 注意细节四 制版流程五 制版细节总结 前言 在做一些培训题目时 xff0c 由于时间有限制 xff0c 在外面开板会花费好几天的制作和快递时间 xff0c 所以有时候就需要自己制版 xff0c 在这里我记录
  • Java打印九九乘法表

    1 使用双重for循环打印九九乘法表 Java源代码如下 xff1a for int i 61 0 i lt 61 9 i 43 43 for int j 61 1 j lt 61 i j 43 43 System out print i
  • 解决selenium打开Chrome浏览器自动退出的问题

    好不容易安装好selenium和对应的浏览器驱动器后终于可以运行程序了 xff0c 结果发现一运行程序后浏览器打开就自动退出了 xff0c 但是我在Python代码中并没有写driver quit 方法 xff0c 上网查了查发现原来是我的
  • 在Java应用中嵌入sshd服务

    这个应用需要依赖apache mina的子项目sshd xff0c 项目主页http mina apache org sshd project index html xff0c 当前版本号为0 8 0 这里的sshd和Linux下的sshd
  • openssl开发库安装时的踩坑指南

    序 前几天用linux编译一个提权脚本的时候报错 openssl opensslv h 没有那个文件或目录 的问题 无论如何也解决不了 xff0c 这下我记录一个踩坑指南防止下一个人掉进坑里 操作 总体介绍 首先介绍一下 xff0c 这个报
  • 性能测试脚本用例【模板】

    产品名称Product name 密级Confidentiality level 秘密 产品版本Product version Total 12pages 共12页 性能测试脚本用例 仅供内部使用 拟制 日期 xff1a 审核 日期 xff
  • Java常见的集合类

    我们常见的Java集合类有List Set Map List 1 接口可以被继承 2 接口可以被多次实现 3 List和ArrayList package List import java util ArrayList import jav
  • WIN7我的电脑右键管理打不开

    问题现象 xff1a 我的电脑右键点击管理无法正常打开 xff0c 会弹出下面的报错信息 首先打开注册表 xff0c 打开运行 xff0c 输入regedit 选择路径 xff1a HKEY LOCAL MACHINE SOFTWARE C
  • LIKE的用法

    我们来谈谈关于like运算符的理解 xff1a 下面是like的语法 xff0c 以后使用到like运算符的都必须根据这个语法使用 LIKE 运算符是用来匹配通配符指定模式的文本值 如果搜索表达式与模式表达式匹配 xff0c LIKE 运算
  • 从0开始详细安装archlinux(UEFI启动)

    隔了一周没更新 xff0c 前阵子把电脑windows卸了装了个archlinux xff0c 不得不说arch是真的香 xff0c 但是坑也是真的多 xff0c 刚踩完所有的坑 xff0c 滚回来写blog了 注 xff1a 本贴为UEF
  • archlinux开机无法联网问题,以及安装archlinuxcn和yay管理器

    前一篇已经安装完了archlinux系统 xff0c 不过真正难的其实并不是安装 xff0c 你的路现在才开始 xff0c 哈哈 添加用户 建议 xff0c 不然使用登录管理器的时候不支持root用户 span class token fu
  • archlinux安装kde桌面和sddm登录管理器

    前几篇已经配置好了archlinuxcn软件仓库 xff0c 网络和nvidia驱动 xff0c 现在来给你的archlinux安装一个kde桌面 xff08 kde玩法有很多 xff0c 可以自己去搜一搜美化教程 xff09 xff0c
  • Spring框架学习

    目录 目录 学习内容 xff1a IoC java中创建对象有哪些方式 xff1a ioc的体现 xff1a DI 是ioc的技术实现 spring的第一个核心功能 ioc Spring 八大模块 Spring的特点 xff1a Sprin
  • CenOs6.7不能使用yum命令

    因为官方不维护了所以 先用更换源 wget O etc yum repos d CentOS Base repo https mirrors aliyun com repo Centos vault 6 10 repo https deve
  • PowerMock注解PowerMockIgnore的使用方法

    故事要从一个异常开始 xff0c 某天我在开发一个加密 解密特性 xff0c 算法使用的是3DES xff0c 样例代码如下 package org jackie study powermock import java io Unsuppo

随机推荐

  • 如何写一棵AVL树

    二叉查找树 二叉查找树有一个缺陷就是查询效率跟树的高度有关 在极端情况下 xff0c 查询效率为n 如何解决二叉查找树效率低问题 xff1f 要增加查询效率 xff0c 高效的方案是在插入的时候对树进行一下平衡操作 xff0c 降低树的高度
  • 点击超链接下载.pdf文件

    上代码 span class token keyword package span span class token class name Servlet span span class token punctuation span res
  • SpringTemplate增删改查及其事务控制基本使用

    一 JdbcCRUD操作 1 导入坐标包 span class token generics span class token punctuation lt span dependency span class token punctuat
  • C语言从键盘读入一个正整数num,计算0 ~ num(包括num)范围内所有奇数之和

    include span class token generics span class token punctuation lt span stdio span class token punctuation span h span cl
  • spring文件上传拦截器及异常处理

    1文件上传 当enctype 61 34 multipart form data 34 时request getParameter 方法失效 单文件上传 导入坐标 span class token generics span class t
  • jxl,java实现创建工作簿Excel并导入数据

    导入jxl jar包 只支持xls格式的excel 导入 span class token generics span class token punctuation lt span dependency span class token
  • springboot整合mybatis

    先创建一个springbooot项目 file gt new project Spring Initalizr 勾选sql mysql Driver 这里和mybatis plus一起整合 span class token generics
  • Mybatis-Plus代码生成器

    span class token operator lt span span class token operator span span class token operator span 代码生成器 span class token o
  • 数据仓库Hive的分区表与分桶表

    一 分区表 分区表实际上就是对应一个HDFS文件系统上的独立的文件夹 xff0c 该文件夹下是该分区所有的数据文件 Hive中的分区就是分目录 xff0c 把一个大的数据集根据业务需要分割成小的数据集 在查询时通过WHERE子句中的表达式选
  • cloudflare动态域名解析-并实现自定义内外网混合动态域名DDNS脚本

    1 获取CloudFlare的API令牌 直接进入地址 xff1a API 令牌 账户名 39 s Account Cloudflare 2 获取根域名ID curl X GET 34 https api cloudflare com cl
  • GitHub新手用法详解【适合新手入门-建议收藏!!!】

    目录 什么是Github xff0c 为什么使用它 xff1f 一 GitHub账号的注册与登录 二 gitbash安装详解 1 git bash的下载与安装 2 git常用命令 3 Git 和 GitHub 的绑定 1 获取SSH key
  • 小米mix2s刷win11和android双系统

    在给电脑安装系统的过程中 xff0c 可能会因为各种原因出现windows无法安装的情况 xff0c 我在给小米mix2s安装win11时发现出现了 计算机意外地重新启动或遇到错误 xff0c windows无法安装 的情况 xff0c 下
  • Windows10开机引导文件被删除后系统修复

    背景 xff1a 本人拯救者y9000p 自己装了个windows10的系统 xff0c 然后要用GAMMA xff0c 想装个Ubuntu的双系统来着 xff0c 但是装过gamma的朋友应该知道这玩意不好装 xff0c 装半天不成功不知
  • RabbitMQ快速入门及六大模式

    目录 核心组件 运行原理 实现步骤 构建Gradle项目 入门案例 简单模式 生产者 xff08 代码 xff09 消费者 xff08 代码 xff09 绑定交换机和队列 发布 订阅模式 xff08 Publish Subscribe xf
  • <生产者、消费者问题>——《Linux》

    目录 1 生产者消费者模型 1 1 为何要使用生产者消费者模型 1 2 生产者消费者模型优点 2 基于BlockingQueue的生产者消费者模型 2 1 BlockingQueue 2 2 C 43 43 queue模拟阻塞队列的生产消费
  • 抖音全自动引流脚本详细使用教学

    大家好我是你们的小编一辞脚本 xff0c 今天给大家分享新的知识 xff0c 很开心可以在CSDN平台分享知识给大家 很多伙伴看不到代码我先录制一下视频 在给大家做代码 xff0c 给大家分享一下抖音引流脚本的知识和视频演示 不懂的小伙伴可
  • 小型医疗门诊挂号系统 医院管理系统后台thinkphp内核源码

    内容目录 一 详细介绍二 效果展示1 部分代码2 效果图展示 三 学习资料下载 一 详细介绍 Thinkphp内核医院医疗门诊系统源码 带第三方配置 带微信登录 功能强大齐全的医疗门诊系统源码 xff0c 使用本系统可大大方便医疗机构的资料
  • Linux查询ip地址ens33没有inet这个属性

    首先输入用户名和密码登录CentOS7虚拟机 xff1b 输入ip addr 这是会发现ens33是没有inet属性的 xff1b 然后输入 xff1a cd etc sysconfig network scripts 找到ifcfg en
  • 保证缓存和数据库的一致性

    如何保证缓存和数据库的一致性 在日常开发中为了提高数据的响应速度 xff0c 可能会讲一些热点数据保存在缓存中 xff0c 这样不用每次去数数据中查询了 xff0c 可用有效提高服务端的响应速度 最常用的缓存就是redis 数据对实时性和精
  • python-qbittorrent库下载电影学习记录(含基本使用和常用函数)

    最近因为一些需求 xff0c 爬了一个带有magnet磁力链接的网站 xff08 如果有对怎么爬感兴趣可以说一声 xff0c 这个文章基本只是为了当成自己的学习记录用哒 xff0c 也会基于爬完的数据库开始做下一步 xff09 xff0c