首页 > Python资料 博客日记
使用 python 下载 bilibili 视频
2024-10-19 14:00:05Python资料围观36次
本文想要达成的目标为:运行 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_encoding
return 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.string
for 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】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj