python 下载 b站视频 和音频

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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统:虚拟存储系统

目录 1、外存资源管理 外存空间划分 进程与外存对应关系 2、虚拟页式存储系统 3、 淘汰算法&#xff08;重点&#xff09;P217 最佳淘汰算法&#xff08;OPT&#xff09; 先进先出(FIFO) 最近最少使用算法&#xff08;LRU&#xff09; 最近不用的先淘汰(LNU) 最不经常…

Linux24.04 安装企业微信

今天工作需要把windows系统换成了linux&#xff0c;但是公司的沟通工具是企业微信。去企业微信官网看了&#xff0c;没有linux版本&#xff0c;只能想办法解决了&#xff0c;不然再换回去就太坑了。 方案 1、使用docker容器&#xff0c;2、使用deepin-wine 本人对docker不太熟…

手机实时提取SIM卡打电话的信令声音--社会价值(一、方案解决了什么问题)

手机实时提取SIM卡打电话的信令声音 --社会价值(一、方案解决了什么问题) 一、前言 这段时间&#xff0c;我们在技术范围之外陷入了一个自证或者说下定义的怪圈&#xff0c;即要怎么样去介绍或者描述&#xff1a;我们是一个什么样的产品。它在当前这个世界上&#xff0c;处于…

UnityShaderLab 实现黑白着色器效果

实现思路&#xff1a;取屏幕像素的RGB值&#xff0c;将三个通道的值相加&#xff0c;除以一个大于值使颜色值在0-1内&#xff0c;再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Bl…

Burp suite2 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…

Devops-蓝鲸篇-01-蓝鲸智云简介

官方社区 蓝鲸智云学习社区&#xff1a;https://bk.tencent.com/s-mart/communities 蓝鲸简介 腾讯蓝鲸智云&#xff0c;简称蓝鲸&#xff0c;是腾讯互动娱乐事业群&#xff08;Interactive Entertainment Group&#xff0c;简称 IEG&#xff09;基于海量异构业务自研的一套…

9. 高效利用Excel设置归档Tag

高效利用Excel设置归档Tag 1. Excle批量新建/修改归档Tag2. 趋势记录模型批量导入归档Tag(Method1)2. 趋势记录模型批量导入归档Tag(Method2)3. 趋势记录控件1. Excle批量新建/修改归档Tag Fcatory Talk常常需要归档模拟量,对于比较大的项目工程会有成千上万个重要数据需…

未来已来:人工智能如何重塑我们的生活与工作

引言 未来的生活和工作场景正从想象走向现实。想象一下&#xff0c;一个清晨&#xff0c;语音助手已经为你安排好一天的任务&#xff0c;自动驾驶汽车准时送你上班&#xff0c;智能冰箱提醒你需要补充的食材。曾经只存在于科幻小说中的场景&#xff0c;如今正在我们的身边实现。…

Ai编程从零开始部署Node项目接口开发之云服务器ECS安装部署mysql(十四)

云风网 云风笔记 云风知识库 为了体验基本的增删改查功能&#xff0c;用户注册/登录/用户列表查询展示/删除用户等接口开发是必要的&#xff0c;这里采用node项目开发部署。如果想要简便&#xff0c;可以采用宝塔运维面板。这里直接官网下载安装包部署云服务器 一、mysql官网下…

jmeter调整字号无法生效?

调整之前如上图&#xff0c;字体非常小&#xff0c;哪怕我设置的字号是48 查阅了资料&#xff0c;试了几次&#xff0c;解决办法如下&#xff1a; 用编辑器打开jmeter.bat 在echo off的下一行添加以下代码 set JVM_ARGS%JVM_ARGS% -Dswing.plaf.metal.controlFontDialog-20…

使用 mkcert 工具自签发 https 证书并进行本地受信

介绍 mkcert 是一个用于创建本地受信任的 SSL/TLS 证书的简单工具&#xff0c;特别适合开发者在本地环境中使用。它解决了为开发和测试目的创建自签名证书时遇到的信任问题。以下是关于 mkcert 的详细介绍&#xff1a; 特点 易用性&#xff1a;只需一条命令即可生成证书&…

视频推拉流EasyDSS无人机直播技术巡查焚烧、烟火情况

焚烧作为一种常见的废弃物处理方式&#xff0c;往往会对环境造成严重污染。因此&#xff0c;减少焚烧、推广绿色能源和循环经济成为重要措施。通过加强森林防灭火队伍能力建设与长效机制建立&#xff0c;各地努力减少因焚烧引发的森林火灾&#xff0c;保护生态环境。 巡察烟火…

C语言:分支结构

C语言&#xff1a;分支结构 分支结构 问题引出 我们在程序设计往往会遇到如下的问题&#xff0c;比如下面的函数的计算 也就是我们是必须要通过一个条件的结果来选择下一步的操作&#xff0c;算法上属于一个分支结构&#xff0c;C语言中实现分支结构主要使用if语句 条件判断…

图像矫正小白指南:从理论到实践的简单实现

一、引言 在日常生活中&#xff0c;使用手机拍全景照片或通过车载摄像头查看倒车影像时&#xff0c;常常会发现画面出现一定程度的变形。例如&#xff0c;建筑物的直线会被拉弯&#xff0c;或者车身轮廓显得不自然。这种现象就是图像畸变&#xff0c;它可能影响美观&#xff0…

【开源】基于SpringBoot框架的读书笔记共享平台 (计算机毕业设计)+万字毕业论文 T029

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

Master EDI 项目需求分析

Master Electronics 通过其全球分销网络&#xff0c;支持多种采购需求&#xff0c;确保能够为客户提供可靠的元件供应链解决方案&#xff0c;同时为快速高效的与全球伙伴建立合作&#xff0c;Master 选择通过EDI来实现与交易伙伴间的数据传输。 EDI为交易伙伴之间建立了一个安…

设计模式之工厂模式:从汽车工厂到代码工厂

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客&#xff0c;你不需要知道汽车是如何被制造出来的&#xff0c;你只需要告诉销售顾问&a…

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟&#xff0c;它集成了Maven和Docker&#xff0c;该插件的官方文档地址如下&#xff1a; 地址&#xff1a;https://github.com/spotify/dockerfile-maven 其他说明&#xff1a; dockerfile是用…

求解自洽场方程

Let’s break down the problem and the solving process step-by-step. Problem Overview The problem appears to be related to linear algebra and possibly quantum mechanics (given the mention of “eigenvalues” and “Hamiltonian” in the Chinese text). We hav…

【JavaEE进阶】关于Maven

目录 &#x1f334;什么是Maven &#x1f332;为什么要学Maven &#x1f38d;创建一个Maven项目 &#x1f384;Maven核心功能 &#x1f6a9;项目构建 &#x1f6a9;依赖管理 &#x1f38b;Maven Help插件 &#x1f340;Maven 仓库 &#x1f6a9;本地仓库 &#x1f6a…