使用 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,)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 1514. 概率最大的路径

1.题目基本信息 1.1.题目描述 给你一个由 n 个节点&#xff08;下标从 0 开始&#xff09;组成的无向加权图&#xff0c;该图由一个描述边的列表组成&#xff0c;其中 edges[i] [a, b] 表示连接节点 a 和 b 的一条无向边&#xff0c;且该边遍历成功的概率为 succProb[i] 。 …

Python知识点:基于Python工具,如何使用Scikit-Image进行图像处理与分析

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 基于Python的Scikit-Image图像处理与分析指南 在Python的科学计算生态系统中&am…

3万字66道Java基础面试题总结(2024版本)

本文合计三万字&#xff0c;整合了66道当前Java面试中比较热门的面试题&#xff0c;希望对大家有所帮助。 文章目录 一、Java概念1. JDK和JRE和JVM的区别2. Java语言有哪些特点3. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f;4. Oracle JDK 和 OpenJDK 的对…

【3dgs】Gaussian-SLAM发展关键历程梳理

【3dgs】Gaussian-SLAM 0. 写在前面1. 3D Splatting与SLAM流程2. Splatting SLAM&#xff1a;单目/RGB-D(2024年新作&#xff09;2.1 相机跟踪精度2.2 新视图渲染性能2.3 消融实验 3. Gaussian-SLAM&#xff08;Photo-SLAM&#xff09; Photo-SLAM技术原理详解 ORBSLAM3dGS&am…

OKG Research:如何衡量链上数据的开放价值?

在新加坡Token2049期间&#xff0c;欧科云链研究院受邀参加Bloomberg主办的企业另类资产投资峰会2024&#xff0c;与多位专家围绕未来数据形态与前景进行了深入交流。 活动后&#xff0c;欧科云链研究院负责人Lola Wang与资深研究员Jason Jiang在大公网发表署名文章《如何衡量…

faust,一个神奇的 Python 库!

大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - faust。 Github地址&#xff1a;https://github.com/robinhood/faust 在分布式系统和实时数据处理的世界里&#xff0c;消息流处理&#xff08;Stream Processing&#xff09;变得越来越重要。Faust 是一个 Python 库…

【工具变量】上市公司企业广告支出数据(2007-2023年)

一、测算方式&#xff1a;具体而言&#xff0c;参照 Lu 等&#xff08;2022&#xff09;的研究&#xff0c;本文通过上市公司财务报表附注获取每家上市公司每年销售费用明细项目&#xff0c;筛选出广告费、广告宣传费、广告推广费、广告策划费、广告展览费等与广告支出相关的项…

Python入门笔记(二)

文章目录 第六章 列表list6.1 创建列表&#xff1a;[]、list()、列表生成式6.2 索引访问元素、元素返回索引index()6.3 列表增加元素:append()、extend()、insert()6.4 列表删除元素&#xff1a;remove()、del()、pop()、clear()6.5 列表修改元素6.6 排序&#xff1a;.sort()、…

防火墙的三种工作模式:路由模式、透明模式(网桥)、混合模式

防火墙作为网络安全的核心设备之一&#xff0c;扮演着至关重要的角色。它不仅能够有效防御外部网络的攻击&#xff0c;还能保护内部网络的安全。在如今复杂多样的网络环境下&#xff0c;防火墙的部署和工作模式直接影响着网络安全策略的实施效果。防火墙通常可以工作在三种模式…

自定义函数查看OS的file cache

简介 在OS中使用cache机制&#xff0c;主要为了提高磁盘的读取效率&#xff0c;避免高频的IO交换。将频繁访问的数据存放在file cache中&#xff0c;下一次在获取的时候就可以直接读取&#xff0c;缓存高命中率对于数据高速检索十分有利。 smem smem 是一个可以显示 Linux 系…

Spring Boot比Spring多哪些注解

Spring Boot相对于Spring框架而言&#xff0c;引入了一些特有的注解来简化配置、自动装配组件和实现声明式服务。以下是一些Spring Boot相对于Spring框架特有的主要注解&#xff1a; SpringBootApplication&#xff1a; 作用&#xff1a;标注一个主程序类&#xff0c;表明这是一…

前端怎么实现电子签名

电子签名&#xff08;e-signature&#xff09;作为一种数字化的签署方式&#xff0c;广泛应用于合同、协议等文件的确认中。随着科技的发展&#xff0c;前端技术也为电子签名的实现提供了便利。本文将探讨在前端如何实现电子签名&#xff0c;包括技术选型、实现步骤及注意事项。…

【即见未来,为何不拜】聊聊分布式系统中的故障监测机制——Phi Accrual failure detector

前言 昨天在看tcp拥塞控制中的BBR(Bottleneck Bandwidth and Round-trip propagation time)算法时&#xff0c;发现了这一特点&#xff1a; 在BBR以前的拥塞控制算法中(如Reno、Cubic、Vegas)&#xff0c;都依赖于丢包事件的发生&#xff0c;在高并发时则会看到网络波动的现象…

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来&#xff0c;说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…

uniapp打包安卓apk步骤

然后安装在手机上就可以啦

【npm问题】报错信息

一、问题 npm ERR! code FETCH_ERROR npm ERR! errno FETCH_ERROR npm ERR! invalid json response body at https://r.cnpmjs.org/npm reason: Invalid response body while trying to fetch https://r.cnpmjs.org/npm: Socket timeout npm ERR! A complete log of this run c…

火狐浏览器 Firefox v131.0.2 第三方tete009编译便携版

火狐浏览器是一款非常优秀的浏览器&#xff0c;它的兼容性和稳定性非常出色&#xff0c;备受全球用户的青睐。Firefox便携版是Firefox浏览器的一个特别版本&#xff0c;它可以在没有安装的情况下使用&#xff0c;非常方便。tete009 Firefox 编译版的启动和加载图片时间是所有火…

985研一学习日记 - 2024.10.17

一个人内耗&#xff0c;说明他活在过去&#xff1b;一个人焦虑&#xff0c;说明他活在未来。只有当一个人平静时&#xff0c;他才活在现在。 日常 1、起床6:00√ 2、健身1个多小时 今天练了二头和背部&#xff0c;明天练胸和三头 3、LeetCode刷了3题 旋转图像&#xff1a…

Ubuntu内存扩容

目录 vmware设置Ubuntu设置查看 读研后发现&#xff0c;Ubuntu的使用量直线上升&#xff0c;之前给配置了20g内存&#xff0c;安装了个ros后&#xff0c;没啥内存了。本文实现给Ubuntu扩容。 vmware设置 这里 我使用别人的截图来演示。 我在这里改成了60 Ubuntu设置 sudo a…

rust不允许在全局区定义普通变量!

文章目录 C 中的全局变量Rust 中的全局变量设计哲学的体现 在 C 和 Rust 中&#xff0c;全局变量的处理方式体现了这两种语言设计哲学上的一些根本性差异&#xff1a; C 中的全局变量 C 允许在全局作用域中定义变量。这些变量在程序的整个生命周期内都存在&#xff0c;从程序开…