使用 python 下载 bilibili 视频
本文想要达成的目标为:运行 python 代码之后,在终端输入视频链接,可自动下载高清 1080P 视频并保存到相应文件夹。
具体可分为两大步:首先,使用浏览器开发者工具 F12 获取请求链接相关信息(根据 api 接口下载?加密参数信息?是从 html 文件获取到具体的链接?链接在 html 文件中位置?);然后,确定使用的 python 库,并写出代码。
最后代码运行结果如图所示:
1. 确定请求链接信息
打开一个视频,对整个过程中的请求进行分析,确定视频链接和音频链接;(下图 1)
首先从 html 源码进行查找,找到了对应的音视频链接;(下图 2)
经过分析,可使用 beautifulsoup 库定位元素位置,标题定位为 bs.find('div', id='viewbox_report').find('div', class_='video-info-title').div.h1.string
,视频链接定位为 bs.head.find_all('script', limit=4)[-1].string.lstrip('window.__playinfo__=')['data']['dash']['video'][2]['baseUrl']
,音频链接定位为 bs.head.find_all('script', limit=4)[-1].string.lstrip('window.__playinfo__=')['data']['dash']['audio'][0]['baseUrl']
。
2. 使用 requests 库下载音视频文件
2.1. 获取 html 源代码
可使用以下函数获取 html 文档:(注:经测试,下载 1080p 视频需要在请求头中加入 登陆帐号cookie)
def _request_html(url: str):'''获取 html 文档源代码并返回'''response = get(url, headers={})response.encoding = response.apparent_encodingreturn response.text
2.2. 下载音视频文件并保存
然后,可根据上一步得到的链接位置,通过 bs 库对 html 文档进行解析,得到所需的 视频标题、视频链接、音频链接,使用 requests 库发送请求下载文件,并存储到本地。
注:因为音视频分离,所以可使用 aiohttp 进行异步下载,稍微提高效率;
注:为美观以及方便查看进度,可使用 rich 库添加进度条;
注:视频文件有时可能比较大,因此可使用流数据分块下载方式进行;
以下代码为提取所需信息代码,可进行参考:(注:首选视频链接有时会失效,因此需提取备用链接)
@staticmethod
def _extract_title_url(html: str):bs = BeautifulSoup(html, 'lxml')# 提取视频标题,并去除非法字符title = bs.find('div', id='viewbox_report').find('div', class_='video-info-title').div.h1.stringfor i in {'/', '\\', '|', '<', '>', '\'', '\"', '?', ':', '*', '\x00'}:title = title.replace(i, ' ')# 提取音视频链接info = bs.head.find_all('script', limit=4)[-1].string.lstrip('window.__playinfo__=')info_dict = loads(info)video_urls = (info_dict['data']['dash']['video'][2]['baseUrl'],info_dict['data']['dash']['video'][2]['backupUrl'][0])audio_urls = (info_dict['data']['dash']['audio'][0]['baseUrl'],info_dict['data']['dash']['audio'][0]['backupUrl'][0],)return (title, video_urls, audio_urls)
3. 使用 ffmpeg 合并音视频
可使用 ffmpeg 进行音视频的合并,合并完毕后删除音视频文件。
注:使用 pip 安装时命令为:pip install ffmpeg-python
注:可使用 rich 库添加进度条
代码如下,可参考:
def _merge(video_path: str, audio_path: str, filepath: str):'''合并音视频'''with _progress_object_merge() as progress:progress.add_task('正在合并音视频', total=None)input_video = ffmpeg_input(video_path)input_audio = ffmpeg_input(audio_path)output = ffmpeg_output(input_video, input_audio, filepath, vcodec='copy', acodec='aac')ffmpeg_run(output, quiet=True)print(f'{filepath} 合并完成')remove(video_path)remove(audio_path)def _progress_object_merge():'''合并音视频的进度条设置'''return Progress(TextColumn('[progress.description]{task.description}', style=CYAN, justify='left'),'•',BarColumn(bar_width=20),'•',TimeElapsedColumn(),transient=True,)
相关文章:

使用 python 下载 bilibili 视频
本文想要达成的目标为:运行 python 代码之后,在终端输入视频链接,可自动下载高清 1080P 视频并保存到相应文件夹。 具体可分为两大步:首先,使用浏览器开发者工具 F12 获取请求链接相关信息(根据 api 接口下…...

DevExpress WinForms中文教程:Data Grid - 如何点击获取信息?
在使用DevExpress WinForms的Data Grid之类控件时,可能需要实现自定义用户交互,例如显示数据行的上下文菜单,或者在双击一行时调用编辑表单。在这些情况下,您需要在指定的坐标处标识网格元素。 在本教程中,您将学习如…...

真空牛肉滚揉机的优点:
真空滚揉机是一种用于食品加工的设备,主要用于肉类深加工,如肉食制品和低温火腿的生产。 它通过滚揉、按压和腌制的过程,在真空状态下将原料肉与辅料、添加剂均匀混合,以提高肉制品的质量和口感。 真空滚揉机的工作原理是利…...

【物流配送中心选址问题】基于退火算法混合粒子群算法
课题名称: 基于退火算法混合粒子群算法的物流配送中心选址问题 改进方向:模拟退火算法优化粒子群算法 代码获取方式(付费): 模型说明: 待补充 Matlab仿真结果: 1. 模型优化后的仿真结果 2…...
elasticsearch 8.2 版本账号密码设置及SSL设置
背景:elasticsearch 8.2 设置账号密码-CSDN博客 failed to load SSL configuration does not contain any trusted certificate entries [2024-10-08T17:06:53,704][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main] org…...

git gui基本使用
一、图形化界面 二、创建新项目 创建文件,加入暂存区,提交到版本库 三、创建分支 四、合并分支 1.切换至master 五、更新分支 六、解决冲突 修改冲突,加入暂存区,提交到版本库 七、远程创建库 Gitee - 基于 Git 的代码托管和研…...
从automaxprocs库浅窥Linux容器的资源控制
automaxprocs能够自动调整Go程序中的Goroutine数量,以充分利用系统资源并提高程序的性能。 automaxprocs通过读取系统信息,如CPU核心数和Cgroups限制,来动态调整Goroutine的数量 automaxprocs获取CPU限额的关键方法在 // CPUQuotaToGOMAXP…...

AI 读文献(二):综述论文10倍速读和整理
我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 上一篇娜姐讲了research研究论文的速度框架和效果, AI阅读研究论文,这个方法10倍速提升效率还不损失关键信息! 学员们反馈效果很好&#x…...

【AAOS】Android Automotive 10模拟器源码下载及编译
源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r47 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emualtor Cluster Home Map All …...

前端开发攻略---使用css实现滚动吸附效果
实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><style>…...
解析 MySQL 查询优化:提升性能的十个关键策略
1. 避免全表扫描 当查询的数据量非常大时,全表扫描的效率会很低。应尽量通过在WHERE和ORDER BY涉及的列上创建索引,避免全表扫描。索引就像一本书的目录,可以快速定位到需要的数据,而不用从头开始逐页查找。 示例: 如…...

QT--QPushButton设置文本和图标、使能禁能、信号演示
按钮除了可以设置显示文本之外,还可以设置图标 文本 可以获取和设置按钮上显示的文本 // 获取和设置按钮的文本 QString text() const void setText(const QString &text)该属性,既可以在 Qt 设计师右侧的属性窗口中修改,也可以在代码…...

PostgreSQL学习笔记六:模式SCHEMA
模式(Schema) PostgreSQL中的模式(Schema)是一个命名的数据库对象集合,包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象,使得同一个数据库中可以包含…...

基础IO -- 理解文件(1)
目录 一:回顾文件 二:加深对文件的理解 1.概念 2.以w写方式打开 3.以a追加方式打开 4.重定向 一:回顾文件 以前学习过在C语言中的文件操作, 但那根本是不足以理解文件的,即站在语言角度是不可能理解文件的 我们要…...

golang包管理
package 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何导入其他包。 包与依赖管理 本章学习目标 掌握包的定义和使用掌握init初始化函数的使用掌握…...

outlook 添加企业邮箱账号出现 553 authentication is required 错误解决
系统报错如下 问题原因 发件服务器身份验证设置错误,或者未勾选发送服务器验证的选项。 解决方案 Outlook客户端 本文以Outlook 2016为例,具体操如下: 1、在Outlook客户端的电子邮件设置窗口中,单击其他设置; 2、…...
一个开源可本地部署的英文翻译服务----EnToZhAPI
EnToZhAPI项目简介 项目背景 提供本地化的英文翻译服务API。支持单句翻译请求或者批量翻译请求。支持建立查询词汇表。 项目架构 前端:使用原生js,使用MDB作为CSS框架。django模板引擎渲染可视化界面。 后端:使用waitress作为后端服务器…...
【unity】编辑器扩展——在OnValidate中创建、删除游戏物体
我们知道在OnValidate中创建游戏物体会发出警告,删除游戏物体会报错。 所以我们使用协程,将开始动作的信号放在OnValidate中,将动作的执行放在帧结尾。 参考代码如下: using System.Collections; using UnityEngine;public clas…...
学习记录:js算法(六十四):最后一块石头的重量
文章目录 最后一块石头的重量思路一思路二 最后一块石头的重量 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。那么粉碎的可能结果如…...
单片机探秘:从理论到应用
单片机探秘:从理论到应用 在这个科技飞速发展的时代,单片机的应用如同一颗璀璨的星星,照亮了我们生活的方方面面。今天,让我们一同深入探讨单片机的原理与应用,揭开这个技术领域的神秘面纱。 1. 单片机概述 1.1 什么…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...