使用 python 下载 bilibili 视频

devtools/2024/10/19 2:45:44/

本文想要达成的目标为:运行 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,)

http://www.ppmy.cn/devtools/126893.html

相关文章

第十三章 RabbitMQ之消息幂等性

目录 一、引言 二、消息幂等解决方案 2.1. 方案一 2.2. 方案二 一、引言 幂等是一个数学概念&#xff0c;用函数表达式来描述是这样的&#xff1a;f(x) f(f(x)) 。在程序开发中&#xff0c;则是指同一个业务&#xff0c;执行一次或多次对业务状态的影响是一致的。有些业务…

韩信走马分油c++

韩信走马分油c 题目算法代码 题目 把油桶里还剩下的10斤油平分&#xff0c;只有一个能装3斤的油葫芦和一个能装7斤的瓦罐。如何分。 算法 油壶编号0&#xff0c;1&#xff0c;2。不同倒法有&#xff1a;把油从0倒进0&#xff08;本壶到本壶&#xff0c;无效&#xff09;&…

GIT batch的支持中文的方法和系统建议

GIT batch是window下原生的GIT命令行终端&#xff0c;兼顾了GIT的命令特性&#xff0c;同时也支持很多UNIX的原生的bash交互方法。但是由于编码问题&#xff0c;在使用GIT bach的时候&#xff0c;用户可能会遇到中文支持的问题。这里简单介绍一下GIT batch在Windows系统下如何有…

【JAVA毕业设计】基于Vue和SpringBoot的渔具租赁系统

本文项目编号 T 005 &#xff0c;文末自助获取源码 \color{red}{T005&#xff0c;文末自助获取源码} T005&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 渔…

Docker下安装RabbitMQ

文章目录 Docker下安装RabbitMQ1. 下载Rabbitmq镜像2. 创建并运行RabbitMQ容器3. 查看启动情况4. 启动RabbitMQ访问的Web客户端4-1 方法一 进入容器开启4-2 方法二 直接开启5. 浏览器访问RabbitMQ的Web客户端页面6. Web客户端页面问题6-1 问题展示6-2 解决方案 Docker下安装Rab…

mongodb-7.0.14分片副本集超详细部署

mongodb介绍&#xff1a; 是最常用的nosql数据库&#xff0c;在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb&#xff08;分片副本&#xff09;集群。 环境准备 系统系统 BC 21.10 三台服务器&#xff1a;192.168.123.247/248/249 安装包&#xff1a…

将 Ubuntu 系统中的 **swap** 空间从 2GB 扩展到 16GB

要将 Ubuntu 系统中的 swap 空间从 2GB 扩展到 16GB&#xff0c;可以按照以下步骤操作&#xff1a; 1. 关闭现有 Swap 文件 首先需要禁用当前的 swap 文件&#xff0c;以便重新调整其大小。 sudo swapoff -a2. 删除旧的 Swap 文件 假设当前的 swap 文件位于 /swapfile&…

自监督学习:引领机器学习的新革命

引言 自监督学习&#xff08;Self-Supervised Learning&#xff09;近年来在机器学习领域取得了显著进展&#xff0c;成为人工智能研究的热门话题。不同于传统的监督学习和无监督学习&#xff0c;自监督学习通过利用未标注数据生成标签&#xff0c;从而大幅降低对人工标注数据…