python 下载 b站视频 和音频

news2024/12/14 2:13:23

video_bvid:在这里插入图片描述

import os
import requests
import json
import re
from bs4 import BeautifulSoup
import subprocess
# from detail_video import video_bvid

# video_bvid 是一个从外部得到的单个视频ID
video_bvid = 'BV1cx421Q7ve'


class BilibiliVideoAudio:
    def __init__(self, bvid):
        """
        初始化方法,接收一个bvid作为视频的唯一标识符。
        """
        self.bvid = bvid
        # 设置请求头,用于模拟浏览器访问Bilibili网站
        self.headers = {
            "referer": "https://search.bilibili.com/all?keyword=%E4%B8%BB%E6%92%AD%E8%AF%B4%E8%81%94%E6%92%AD&from_source=webtop_search&spm_id_from=333.1007&search_source=5&page=4&o=90",
            "origin": "https://search.bilibili.com",
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
            'Accept-Encoding': 'gzip, deflate, br'
        }

    def get_video_audio(self):
        """
        获取视频和音频的链接以及视频标题。
        """
        # 构造视频链接并发送请求获取页面内容
        url = f'https://www.bilibili.com/video/{self.bvid}/?spm_id_from=333.337.search-card.all.click&vd_source=14378ecd144bed421affe1fe0ddd8981'
        content = requests.get(url, headers=self.headers).content.decode('utf-8')
        # 使用BeautifulSoup解析HTML内容
        soup = BeautifulSoup(content, 'html.parser')

        # 获取视频标题
        meta_tag = soup.head.find('meta', attrs={'name': 'title'})
        title = meta_tag['content']

        # 获取视频和音频链接的正则表达式
        pattern = r'window\.__playinfo__=({.*?})\s*</script>'
        # 提取并解析JSON数据
        json_data = re.findall(pattern, content)[0]
        data = json.loads(json_data)

        # 提取视频和音频的基础URL
        video_url = data['data']['dash']['video'][0]['base_url']
        audio_url = data['data']['dash']['audio'][0]['base_url']

        # 返回包含标题、视频URL和音频URL的字典
        return {
            'title': title,
            'video_url': video_url,
            'audio_url': audio_url
        }

    def download_video_audio(self, url, filename):
        """
        下载视频或音频文件。
        """
        # 对文件名进行清理,去除不合规字符
        filename = self.sanitize_filename(filename)
        try:
            # 发送请求下载文件内容
            resp = requests.get(url, headers=self.headers).content
            # 构造下载路径
            download_path = os.path.join('D:\\video', filename)
            # 将文件内容写入到指定路径
            with open(download_path, mode='wb') as file:
                file.write(resp)
            # 打印下载完成信息
            print("{:*^30}".format(f"下载完成:{filename}"))
        except Exception as e:
            # 打印异常信息
            print(e)

    def sanitize_filename(self, filename):
        """
        清理文件名中的不合规字符。
        """
        # 定义不合规字符的正则表达式
        invalid_chars_regex = r'[\"*<>?\\|/:,]'

        # 替换不合规字符为空格
        sanitized_filename = re.sub(invalid_chars_regex, ' ', filename)

        return sanitized_filename

    def merge_video_audio(self, video_path, audio_path, output_path):
        """
        使用ffmpeg来合并视频和音频。
        """
        try:
            # 构造ffmpeg命令行参数
            command = [
                'ffmpeg',
                '-y',  # 覆盖输出文件如果它已经存在
                '-i', video_path,  # 输入视频路径
                '-i', audio_path,  # 输入音频路径
                '-c', 'copy',  # 复制原始数据,不进行转码
                output_path  # 输出视频路径
            ]
            # 执行ffmpeg命令
            subprocess.run(command, check=True)
            # 打印合并完成信息
            print(f"视频和音频合并完成:{output_path}")
        except subprocess.CalledProcessError as e:
            # 打印合并失败信息
            print(f"合并失败: {e}")


def main():
    try:
        # 只处理一个 bvid(Bilibili 视频的唯一标识符)
        bilibili = BilibiliVideoAudio(video_bvid)  # 创建一个Bilibili视频音频处理对象,传入视频bvid
        video_audio_info = bilibili.get_video_audio()  # 获取视频和音频的信息

        # 从返回的信息中提取标题、视频URL和音频URL
        title = video_audio_info['title']
        video_url = video_audio_info['video_url']
        audio_url = video_audio_info['audio_url']

        # 定义处理后的视频存放路径
        processed_videos_path = 'D:\\processed_videos'
        # 如果该路径不存在,则创建该路径
        if not os.path.exists(processed_videos_path):
            os.makedirs(processed_videos_path)

        # 构造视频文件名、音频文件名和输出文件名
        video_filename = f"{title}.mp4"
        audio_filename = f"{title}.mp3"
        output_filename = f"{title} - combined.mp4"

        # 构造视频文件、音频文件和输出文件的完整路径
        video_file_path = os.path.join('D:\\video', video_filename)
        audio_file_path = os.path.join('D:\\video', audio_filename)
        output_file_path = os.path.join(processed_videos_path, output_filename)

        # 下载视频和音频到指定位置
        bilibili.download_video_audio(video_url, video_filename)  # 下载视频
        bilibili.download_video_audio(audio_url, audio_filename)  # 下载音频
        # 合并下载的视频和音频文件到指定输出路径
        bilibili.merge_video_audio(video_file_path, audio_file_path, output_file_path)

        # 可选:合并后删除单独的视频和音频文件
        # os.remove(video_file_path)
        # os.remove(audio_file_path)

    except Exception as ex:
        # 捕获并打印处理视频/音频时发生的异常
        print(f"处理视频/音频 {video_bvid} 失败: {ex}")


main()

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

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

相关文章

时间敏感网络与工业通信的融合:光路科技电力专用交换机和TSN工业交换机亮相EP电力展

12月7日&#xff0c;第三十一届中国国际电力设备及技术展览会&#xff08;EP Shanghai 2024&#xff09;暨上海国际储能技术应用展览会在上海新国际博览中心圆满落幕。本届展会以“数字能源赋能新质生产力”为主题&#xff0c;系统地呈现了电力设备行业在技术融合、转型升级及上…

如何将CSDN的文章保存为PDF?

目录 1、打开CSDN文章2、按F12或者鼠标右键选择检查并进入控制台3、在控制台输入以下代码4、然后回车&#xff08;Enter&#xff09;如果纵向显示不全就横向 1、打开CSDN文章 2、按F12或者鼠标右键选择检查并进入控制台 3、在控制台输入以下代码 (function(){ $("#side&q…

android AIDL ipc binder转换

一. 概述 众所周知AIDL并不是所有的数据类型都可以传输。 可以传输的类型包括&#xff1a; 1.原生类型 2.String 3. CharSequence 4. List 5.Map 6. Binder 7. Parcelable 容器类 parcelable传输的时候会分解成成员&#xff0c;数组item的方式&#xff0c;传输完成后再进行…

JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测

JCR一区牛顿-拉夫逊优化算法分解对比&#xff01;VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比&#xff01;VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…

解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法

文章目录 解决&#xff1a;IDEA中Autowired自动注入MyBatis Mapper报红警告的几种解决方法问题描述&#xff1a;解决办法&#xff1a;1.将Autowired注解改成Resource2.给Autowired(required false)设置属性3.给Mapper层加注解Mapper/Repository4.改变写法,用RequiredArgsConst…

C语言-详细解答-重组字符串并16进制转10进制

1.题目要求 2.代码实现 #include <stdio.h> #include <ctype.h> #include <string.h>int hexToDec(char hex[]) {int len strlen(hex);int base 1;int dec 0;for (int i len - 1; i > 0; i--) {if (isdigit(hex[i])) {dec (hex[i] - 0) * base;} e…

sheng的学习笔记-AI-注意力模型(Attention Model)

Ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 先看下这两个文章&#xff1a; 序列模型&#xff1a;sheng的学习笔记-AI-序列模型&#xff08;Sequence Models&#xff09;&#xff0c;RNN,GRU,LSTM_音乐识别是一对多吗-CSDN博客 机器翻译 sheng的学习笔记-AI-自然语…

Arduino: Arduino IDE安装

目录 1.1 Arduino软件下载与安装 1.2 esp32_arduino的开发库安装 1.3 手动安装板支持包 1.1 Arduino软件下载与安装 Arduino官网下载地址&#xff1a;https://www.arduino.cc/en/software。 1.2 esp32_arduino的开发库安装 接下来安装esp32_arduino的开发库。 1.2.1 在线安…

在Ubuntu 22.04上搭建Kubernetes集群

Kubernetes 简介 什么是 Kubernetes&#xff1f; Kubernetes&#xff08;常简称为 K8s&#xff09;是一个强大的开源平台&#xff0c;用于管理容器化应用程序的部署、扩展和运行。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation&#xff08;CNCF&#xff0…

【ubuntu】将Chroma配置为LINUX服务

Chroma是一个轻量级向量数据库。既然是数据库&#xff0c;那么我希望它是能够长时间运行。最直接的方式是配置为service服务。 可惜官方没有去提供配置为服务的办法&#xff0c;而鄙人对docker又不是特别感冒。所以自己研究了下chroma配置为服务的方式。 系统&#xff1a;ubu…

【CSS in Depth 2 精译_071】11.4 思考字体颜色的对比效果 + 11.5 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…

PHP:连接Grid++Report模板,实现循环打印

实现效果 模板 代码 cycle.php <html xmlns"http://www.w3.org/1999/xhtml"><head><title>Web报表(B/S报表)演示 - 不用报表插件展现报表而是直接输出</title><meta http-equiv"Content-Type" content"text/html; chars…

Ubuntu22.04安装docker desktop遇到的bug

1. 确认已启用 KVM 虚拟化 如果加载了模块&#xff0c;输出应该如下图。说明 Intel CPU 的 KVM 模块已开启。 否则在VMware开启宿主机虚拟化功能&#xff1a; 2. 下一步操作&#xff1a; Ubuntu | Docker Docs 3. 启动Docker桌面后发现账户登陆不上去&#xff1a; Sign in | …

STM32F103单片机HAL库串口通信卡死问题解决方法

在上篇文章 STM32F103单片机使用STM32CubeMX创建IAR串口工程 中分享了使用cubeMX直接生成串口代码的方法&#xff0c;在测试的过程中无意间发现&#xff0c;串口会出现卡死的问题。 当串口一次性发送十几个数据的时候&#xff0c;串口感觉像卡死了一样&#xff0c;不再接收数据…

qt QCommandLineParser详解

1、概述 QCommandLineParser是Qt框架中提供的一个类&#xff0c;专门用于解析命令行参数。它简化了命令行参数的处理过程&#xff0c;使得开发者能够轻松定义、解析和验证命令行选项和参数。QCommandLineParser适用于需要从命令行获取输入的控制台应用程序&#xff0c;以及需要…

默认插槽,具名插槽(v-slot:具名,name=‘ ‘),作用域插槽

在App.vue父组件需要两次调用MyDialog子组件&#xff0c;但是想要两个子组件中略有不同。 1.首先在父组件中引入子组件&#xff0c;定义子组件&#xff0c;展示组件标签 2.不一样的地方在子组件中放<slot>标签占位 3.在父组件中的子组件标签中写上不一样的内容&#xff0…

快速上手Neo4j图关系数据库

快速上手Neo4j图关系数据库 参考视频&#xff1a; 【IT老齐589】快速上手Neo4j网状关系图库 1 Neo4j简介 Neo4j是一个图数据库&#xff0c;是知识图谱的基础 在Neo4j中&#xff0c;数据的基本构建块包括&#xff1a; 节点(Nodes)关系(Relationships)属性(Properties)标签(Lab…

远程桌面防护的几种方式及优缺点分析

远程桌面登录是管理服务器最主要的方式&#xff0c;于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码&#xff0c;悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全&#xff0c;攻击者可以利…

【机器学习】基础知识:拟合度(Goodness of Fit)

拟合度概念及意义 拟合度&#xff08;Goodness of Fit&#xff09;是衡量统计模型对数据解释能力的指标&#xff0c;用于评价模型对观测数据的拟合效果。在回归分析、分类模型或其他预测模型中&#xff0c;拟合度是模型性能的重要衡量标准。 1. 拟合度的作用 拟合度的主要作用…

康耐视智能相机(Insight)通过ModbusTCP发送字符串到倍福(BECKHOFF)PLC中

文章目录 1.背景2.分析3.实现3.1.PLC的ModbusTCP_Server3.1.1.安装TF6250-Modbus-TCP3.1.2.PLC设置 3.2.智能相机的ModbusTCP_Client3.2.1.了解ModbusTCP的协议3.2.2.根据协议写代码3.2.2.1.纯函数代码3.2.2.2.脚本代码 3.2.3.非脚本处理时的代码逻辑图3.2.4.关于代码的问题及解…