代码改变生活-使用You-Get下载bilibili的视频【三】

2023-05-16

本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/112167893

我自己都想不到,这个分享做到了第三篇,前两篇是 第一篇、第二篇;这一篇主要是对之前代码的优化+一些介绍。

这是我写的 代码改变生活的 category,有兴趣可以看看;

个人博客:https://blog.csdn.net/zyooooxie

使用介绍

最终版 支持:

  1. 下载 单独某个视频
  2. 下载 某个多P视频
  3. 下载 某个up主的全部视频
  4. 下载的视频 格式转换 mp4 > flv

实际流程:

  1. 用户将url写入本地的某个txt文件 (此外:可指定画质、指定下载某几P、一次下载多个url);

  2. 脚本执行,读取txt文件;根据画质、下载某几P、重命名的配置,访问此HTML;

  3. 使用you-get解析下载;

  4. 实际观看视频时,若视频无图像,转格式(可选 最新下载的 or 全部的);

  5. 步骤 3、4 都是Windows的bat 触发、执行,用户不接触代码;

  6. 【较少】可下载某up的全部视频,txt不支持(可脚本执行);

  7. 【极少】多P视频出现相同文件名,txt不支持(可脚本执行);

说是给我自己用,实际还有我妈、我朋友,所以就尽可能做的简单、傻瓜式;

代码优化

这次优化主要是 支持txt;


    def read_txt(self, txt_abs_path=None, second_someParts=None):
        """
        读取txt内容 下载
        :param txt_abs_path:
        :param second_someParts:第二项 为指定下载的某几P
        :return:
        """
        if txt_abs_path is None:
            txt = '网址.txt'
        else:
            txt = txt_abs_path

        try:
            with open(txt, "r", encoding="utf-8") as f:
                url_list = f.readlines()

        except Exception as e:
            print(e, '当前文件异常')

        # re_str = r'video/\w.+'
        # re_com = re.compile(re_str)
        for u in url_list:

            # txt的url、画质、下载某几P  使用空格来间隔
            if u.find(' ') != -1:

                # 第二项为画质
                if second_someParts is None:

                    qn = u[u.find(' '):]
                    qn = qn.strip()

                    # 指定某几P
                    if qn.find(' ') != -1:

                        some_parts = json.loads(qn[qn.find(' '):].strip())
                        print('指定下载:{}'.format(some_parts))
                        qn = json.loads(qn[:qn.find(' ')])

                    # 不指定某几P
                    else:
                        some_parts = None
                    print('指定画质:{}'.format(qn))

                # 第二项为 下载的某几P,不指定画质
                else:
                    some_parts = json.loads(u[u.find(' '):].strip())
                    print('指定下载:{}'.format(some_parts))
                    qn = None

                u = u[: u.find(' ')]

            # 只有url【没有画质、下载的某几P】
            else:
                qn = None
                some_parts = None

            # url处理
            if u.find('/?') != -1:
                u = u[: u.find('/?')]
            elif u.find('?') != -1:
                u = u[: u.find('?')]
            u = u.replace('\n', '')
            print(u)

            # print(re_com.search(u))
            # print(re_com.search(u).group())

            # 解析HTML,获取name\宽高
            name_list, w_h_list = self.get_name_list(url=u)

            # 只一个name [单个视频]
            if len(name_list) == 1:
                if qn is None:
                    qn = self.return_format(w_h_list[0])
                else:
                    qn = self.change_format(int(qn))

                print(qn)
                self.down_one(url=u, txt_format_qn=qn)

            # 多个name [此url 多P视频]
            else:
                if qn is None:
                    if second_someParts is not None:
                        # index 不适合
                        # w_h = list(filter(lambda x: w_h_list.index(x) in some_parts, w_h_list))
                        w_h_list = [w_h_list[s] for s in some_parts]

                    qn = [self.return_format(wh) for wh in w_h_list]
                else:
                    qn = [self.change_format(int(q)) for q in qn]

                print(qn)
                self.down_multipart(url=u, txt_qn=qn, some_parts=some_parts)


    def down_one(self, url, format_qn: int = None, down_path=r'F:\bili', txt_format_qn=None):
        """
        下载某url
        :param url:
        :param format_qn:
        :param down_path:
        :param txt_format_qn:读取txt文件 画质
        :return:
        """
        # 脚本直接使用
        if txt_format_qn is None:
            assert format_qn is not None
            format_str = self.change_format(format_qn=format_qn)

        # txt使用
        else:
            format_str = txt_format_qn

        cmd = """you-get {} {} -o {} --no-caption""".format(format_str, url, down_path)
        print(cmd)
        os.system(cmd)

        # cmd = 'explorer {}'.format(down_path)
        # os.system(cmd)
        

    def down_multipart(self, url, format_qn_list=None, root_path=r'F:\bili', rename_file=None, some_parts=None, txt_qn=None):
        """
        批量下载
        :param url:请求url
        :param format_qn_list:画质
        :param root_path:下载路径
        :param rename_file:默认为None,不用重命名
        :param some_parts: 下载某p;传list
        :param txt_qn:读取txt文件 拿到的画质
        :return:
        """
        os.chdir(root_path)
        new_dir = url.split('/')[-1]
        if not os.path.exists(new_dir):
            os.mkdir(new_dir)
        down_path = os.path.join(root_path, new_dir)

        # 不使用txt,脚本执行【不推荐】
        if format_qn_list is not None:
            assert txt_qn is None

            # 相同画质[使用一个qn]、文件名不重复
            # 【使用某画质,有可能会出现画质不对的情况】
            if isinstance(format_qn_list, int) and rename_file is None:
                format_str = self.change_format(format_qn=format_qn_list)
                cmd = """you-get {} --playlist {} -o {} --no-caption --debug""".format(format_str, url, down_path)
                print(cmd)
                os.system(cmd)

        # 使用txt的内容【推荐】
        else:
            format_qn_list = txt_qn

            if rename_file is not None:
                fact_name_list = self.get_name_list(url=url)[0]
                assert len(fact_name_list) == len(format_qn_list)

            for index, i in enumerate(format_qn_list):
                format_str = i

                if some_parts is not None:
                    assert len(some_parts) == len(format_qn_list)
                    url_index = some_parts[index]
                else:
                    url_index = index + 1

                new_url = ''.join([url, '?p={}'.format(url_index)])
                cmd = """you-get {} {} -o {} --no-caption""".format(format_str, new_url, down_path)
                print(cmd)
                os.system(cmd)

                # txt不支持 重命名
                if rename_file is None:
                    continue

                else:
                    # 极少出现文件名重复的情况,若出现,请脚本执行,给rename_file传参

                    name = fact_name_list[index]
                    os.chdir(down_path)
                    all_files = os.listdir(down_path)
                    all_files = [i for i in all_files if i.endswith(('mp4', 'flv'))]
                    down_file_last = sorted(all_files, key=lambda x: os.path.getmtime(x))[-1]
                    file_type = os.path.splitext(down_file_last)[1]

                    os.rename(down_file_last, ''.join([name, file_type]))

        # cmd = 'explorer {}'.format(down_path)
        # os.system(cmd)
        

    def down_up_all_videos(self, up_mid, root_path=r'F:\bili'):
        bvid = self.get_up_videos_BV(up_mid=up_mid)
        down_url = [''.join(['https://www.bilibili.com/video/', bv]) for bv in bvid]
        print(down_url)

        up_mid = str(up_mid)
        os.chdir(root_path)
        if not os.path.exists(up_mid):
            os.mkdir(up_mid)
        down_path = os.path.join(root_path, up_mid)
        print(down_path)
        print()

        for d in down_url:
            name_list, w_h_list = self.get_name_list(url=d)
            if len(name_list) == 1:
                qn = self.return_format(w_h_list[0])
                self.down_one(url=d, down_path=down_path, txt_format_qn=qn)

            else:
                qn = [self.return_format(wh) for wh in w_h_list]

                self.down_multipart(url=d, root_path=down_path, txt_qn=qn)

展示

在这里插入图片描述
在这里插入图片描述

关于you-get下载B站视频的分享 应该到此为止了。

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

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

代码改变生活-使用You-Get下载bilibili的视频【三】 的相关文章

  • PHP GET 变量数组注入

    我最近了解到可以将数组注入 PHP GET 变量来执行代码 php a asd a asdasd b a 这就是我得到的例子 我不知道它是如何工作的 并且想知道这是否可能 PHP 将解析查询字符串 并将这些值注入到 GET超全局数组 同样适
  • 如何在参数 $_GET 中使用变量?示例:($_GET[$my_var])

    我正在开发一个WordPress插件 GET的参数根据用户的偏好通过Wordpress管理面板记录在数据库中 以下验证必须通过 GET 进行 这是函数 db url get option my get url returns the val
  • jQuery 加载到变量

    我需要将 jQuery 加载结果插入到变量中 页面 ajax html 上带有 id 测试的元素的内容 result load ajax html test 尝试使用jQuery get http api jquery com jQuery
  • Ruby on Rails 3:如何分别检索 POST 和 GET 参数?

    我知道你可以使用获取参数params 但问题是它合并了所有参数 无论它们是通过GET or POST 如果您通过以下方式发送请求GET 没问题 参数只能挤在URL里 但如果你发送一个POST具有类似 URL 的请求 blabla foo b
  • Ruby 中的参数化 get 请求?

    如何创建 HTTPGETRuby 中带参数的请求 这很容易做到 当你POSTing require net http require uri HTTP post form URI parse http www example com sea
  • 对于 .com 电子邮件地址,获取请求失败,因为 Spring 将其解释为扩展名

    参见下面2015年8月20日的编辑部分 我最近也遇到了类似的问题 获取请求仅适用于尾部斜杠 Spring REST 注释 https stackoverflow com questions 31117009 get request only
  • getActivity() 在我的 ActivityInstrumentationTestCase2 类中返回 null

    我希望我的应用程序使用 ActivityInstrumentationTestCase2 在代码中执行以下测试 问题是 getActivity 方法返回 null 这会导致包含 getActivity 的行正下方的行出现 NullPoint
  • 在嵌套有序字典 python 中查找给定键的值

    我试图从嵌套的 OrderedDict 中查找给定键的值 关键点 我不知道这个字典会嵌套多深 我正在寻找的键的名称是不变的 它将位于字典中的某个位置 我想返回本例中名为 powerpoint color 的键的值 mydict Ordere
  • 如何在android sdk中从图库中获取图像并将其显示到屏幕上

    我想知道如何从图库中获取预先保存的图像 然后将其显示到屏幕上 任何教程 有用的链接和信息将不胜感激 如果您希望我进一步解释任何内容 请询问 Intent photoPickerIntent new Intent Intent ACTION
  • 检查隐藏是否等于 true 或 false jQuery

    我有这个 div attr hidden true i tried var a div attr hidden var b div attr hidden val var c div hidden var a div disabled 我只
  • Zend url:获取参数始终保留在 url 中

    我在使用带有 get 参数的 Zend url 帮助器时遇到一些问题 在一个视图中 我有分页 它在 get 中发送额外的参数 所以在 url 中 所以没关系 但这是不行的 即使我更改页面 参数也始终保留在 url 中 事实上 zend ur
  • WordPress 按标题获取帖子,例如

    我正在尝试为 WordPress 创建一个小型搜索功能 AJAX 调用应该获取标题类似的所有帖子 quote 是否有可能在内部实现这种情况get posts 功能 别误会我的意思 阿贾克斯工作正常 我的functions php 中有aja
  • Spark Java框架中如何使用get获取请求参数?

    我是 Sparkjava 的新手 我想使用 Spark java 读取我的请求参数 但我无法找到正确的语法 请帮帮我 下面是我的路由方法和客户端对其的调用 我的客户请求网址 smartapp getDataViewModelConfig c
  • 如何通过 Ruby 中的代理获取带有用户代理和超时的 URL?

    如果我需要通过某些方式获取 URL 我该如何获取 URLproxy 它必须有一个timeout最大 n 秒 和一个用户代理 require nokogiri require net http require rexml document d
  • AngularJS - 在等待数据/数据计算时加载图标

    我有一个简单的 Angular http get app factory countriesService function http return getCountryData function done http get resourc
  • 使用 AJAX 获取特定 DOM 元素(使用 Javascript,而不是 jQuery)

    如何使用 AJAX 用简单的 JavaScript 语言 NOTjQuery 获取页面 同一域 并仅显示特定的 DOM 元素 比如id为 bodyContent 标记的DOM元素 我正在使用 MediaWiki 1 18 所以我的方法必须稍
  • $_GET 作为 PHP 函数中的参数

    我有同样的问题 但是 我根据使用标头的 if 语句将用户重定向到通过函数构造的动态页面 为了使该函数正常工作 需要在标头的 GET 部分中传递参数 根据提供的答案 这是一种不好的做法 我应该用什么方式来做呢 function page ti
  • 使用 jQuery 将值发送到 $_GET

    我正在使用一个 PHP 脚本 该脚本正在通过 GET 等待两个值 我正在尝试使用 jQuery 传递这两个值 而这正是我不太擅长的地方 这是我得到的代码 有人能指出我正确的方向吗 谢谢 function xrate id rating aj
  • HttpGet 401 状态代码后跟 200 状态代码

    我使用 Apachage HttpComponent 访问 Web 服务时遇到奇怪的行为 我可以访问服务器日志 当我尝试连接到服务器并执行 httpGet 命令时 我可以在日志中首先看到 401 状态 http 未经授权 然后看到 200
  • Memcached的get和put方法是线程安全的吗

    多线程环境下memcached中的key是否有可能出现乱码 如果是这样 如何以最短的同步时间避免它 使用Java客户端访问memcached服务器 不会 Memcache 将返回某人之前写入的值 而不是乱码 如果您获取 修改 放置 则无法保

随机推荐

  • 朋友(并查集)

    朋友 AC in luogu P2078 题目背景 小明在A公司工作 xff0c 小红在B公司工作 题目描述 这两个公司的员工有一个特点 xff1a 一个公司的员工都是同性 A公司有N名员工 xff0c 其中有P对朋友关系 B公司有M名员工
  • Ubuntu20.04 wifi连不上或频繁掉线解决办法

    一 新装Ubuntu20 04后发现wifi连不上 xff0c 提示网络激活失败 xff0c 经一番研究发现是网卡驱动问题 解决办法如下 xff1a 点击左下角 显示应用程序 按钮 xff0c 找到 软件和更新 双击打开 xff0c 单击
  • 右移运算符总结

    概念 右移运算符是将一个二进制数按指定移动的位数向右移动 移动过程中 xff0c 正数最高位补0 xff0c 负数最高位补1 xff0c 无符号数最高位补0 补码 在计算机系统中 xff0c 数值一律用补码来表示和存储 xff0c 其中最高
  • PVE7.2-3直通独显 nvidia 1080ti

    1 编辑 etc default grub vim etc default grub 修改对应参数 GRUB CMDLINE LINUX DEFAULT 61 quiet intel iommu 61 on iommu 61 pt 2 编辑
  • Ubuntu 18.04 服务器版安装桌面及软件

    Ubuntu 18 04 服务器版安装软件记录 设置root密码使用root用户登录安装ssh xff08 远程连接用 xff09 xff0c 最小化安装的需要 xff0c 一般已安装 将 PermitRootLogin prohibit
  • 函数 —【回调函数的创建和调用】

    function test callback callback 2 console log 39 我是主题函数 39 function callc data console log data test callc 将一个函数的调用委托给另一
  • Win11笔记本连接热点(无线)后即自动断网怎么办?

    Win11笔记本连接热点 xff08 无线 xff09 后即自动断网怎么办 xff1f 有很多笔记本用户反应电脑PC连接到热点时 xff0c Windows电脑会自动断开与 Internet 的连接 xff0c 这是什么原因呢 xff1f
  • MyBatis Generator配置文件--指定生成实体类的属性名

    table标签下的设置属性useActualColumnNames用于指定生成实体类时是否使用实际的列名作为实体类的属性名 xff0c 取值true或false true xff1a MyBatis Generator会使用数据库中实际的字
  • MySQL 判断某个值是纯数字(正则判断)

    判断某个值是纯数字 这个sql 判断在字符串只有1个非数字的情况 判断不出来 span class token keyword select span span class token operator span span class to
  • mysql 取反操作

    span class token keyword update span span class token keyword table span span class token keyword set span filed span cl
  • error RC1015: cannot open include file ‘afxres.h‘. 的解决办法

    转载 参考 引用请注明出处 文章地址 xff1a https blog csdn net duiwangxiaomi article details 88822702 spm 61 1001 2014 3001 5501 编译工程时出现如下
  • 程序包com.sun.xml.internal.bind.v2不存在解决

    程序包com sun xml internal bind v2不存在 导入com sun xml internal 下的包并且没使用时打包也会报这个错误 全局搜索 com sun xml internal bind v2 删除掉import
  • fastjson byte[]转json字符串

    直接JSON toJSONString 会转为 base64字符串 可以使用JSON toJSON param toString 进行转换
  • SVN文件夹红色感叹号

    SVN文件夹红色感叹号 文件夹更新无最新文件 也没提交 解决方案 1右键 svn清理 2 提交 原因 有可能是svn上面有你之前提交的文件 而在你的本地目录里面删除了
  • jetson nano ubuntu 备份系统至u盘/移动硬盘

    jetson nano ubuntu备份系统至u盘 移动硬盘 1 df h 查看 信息2 挂载u盘2 1 fat322 2 ntfs2 3 挂载被占用 3 刷系统4 解除挂载 1 df h 查看 信息 一般都是 dev sda dev sd
  • 安装 cuda 从装系统开始

    勾选这个选项后就可以跳过安装驱动的环节了 设置root密码 sudo passwd root 安装openssh server 开xshell sudo apt get update sudo apt get install openssh
  • mac用完移动硬盘后 windows识别不出 解决方案

    cmd 运行 chkdsk F f
  • Cannot find reference ‘imread‘ in ‘__init__.py‘

    Cannot find reference imread in init py 前言 本人java开发 只是用python解决部分问题 可能解决方案不专业或者有问题 请自己判断 毕竟我只是简单处理下图片 解决方案 方案一 pip insta
  • RobotMaster资料汇总

    1 软件 xff1a 软件可以去网上下载 xff0c 或者去淘宝购买 xff0c 还包安装 不过基本上都是在虚拟机上操作 xff0c 只有在XP系统下可以直接安装 若是正版软件 xff0c 则会包含正确的安装教程 其中包括 xff1a MA
  • 代码改变生活-使用You-Get下载bilibili的视频【三】

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 112167893 我自己都想不到 xff0c 这个分享做到了第三篇 xff0c