下载B站视频作为PPT素材

news2024/11/16 5:33:59

下载B站视频作为PPT素材

    • 1. 下载原理
    • 2. 网页分析
    • 3. 请求页面,找到数据
    • 4. 数据解析
    • 5. 音频、视频下载
    • 6. 合并音频与视频
    • 7. 完整代码

  其实使用爬虫也不是第一次了,之前从网站爬过图片,下载过大型文件,如今从下载视频开始才想到要写一篇关于爬虫的博客。
  这次是为了给PPT添加视频,发现我的WPS当前版本只能添加本地视频,在线视频无法添加,并且还需要会员才可以添加大于20M的视频。Office只能添加它支持的以YouTube为代表的视频网站的一些视频,无法添加像B站等国内网站的在线视频。对于添加本地视频,WPS和Office添加方法没有什么区别,WPS还有文件大小的限制。

在这里插入图片描述
  不能添加在线视频就只能退而求其次,添加下载好的视频,这就遇到个问题,我们要先下载好视频。

1. 下载原理

  获取视频资源的源地址,然后爬取视频的二进制内容,再写入到本地即可。

2. 网页分析

案例视频地址:https://www.bilibili.com/video/BV1Um411r7gW/?spm_id_from=333.337.search-card.all.click&vd_source=148afb6cb7e28daa45a2f426a0dec4ee

  打开该网页,然后F12进入开发者模式,接着点开网络—>全部,因为视频资源一般比较大,我这里根据大小进行了从大到小的排序,找到了第一条这些可能和视频源地址有关。

在这里插入图片描述
  查看页面源代码,经过查找可以发现视频在“playinfo”处,图片并不完整,大家可以自行搜取。

3. 请求页面,找到数据

	session = requests.session()
    url = 'https://www.bilibili.com/video/BV1Um411r7gW/?spm_id_from=333.337.search-card.all.click&vd_source=148afb6cb7e28daa45a2f426a0dec4ee'
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.37',
        "Referer": "https://www.bilibili.com"}
    resp = session.get(url, headers=headers)
    # print(resp.text)

  利用session代替requests进行请求,session可以认为是一连串的请求,在这个过程中的cookie不会丢失。
referer代表防盗链,请求头中没有这一项将请求不到内容。防盗链可以在抓包工具中查找

4. 数据解析

	title = re.findall(r'<title data-vue-meta="true">(.*?)_哔哩哔哩_bilibili', resp.text)[0]
    play_info = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]

    '''print(title)
    print(play_info,type(play_info))'''
    json_data = json.loads(play_info)
    # pprint.pprint(json_data) #格式化输出,便于观看
    # print(type(json_data))
    audio_url = json_data['data']['dash']['audio'][0]['backupUrl'][0]  # 音频地址 [0]清晰度最高
    video_url = json_data['data']['dash']['video'][0]['backupUrl'][0]  # 视频地址

title与代码对应部分

<title data-vue-meta="true">【揭秘】Transformer诞生背后的故事_哔哩哔哩_bilibili</title>

playinfo与代码对应部分

<script>
window.__playinfo__={"code":0,"message":"0","ttl":1,"data":{"from":"local","result":"suee","message":"","quality":32,"format":"flv480","timelength":229505,"accept_format":"hdflv2,flv,flv720,flv480,mp4","accept_description":["高清 1080P+","高清 1080P","高清 720P","清晰 480P","流畅 360P"],"accept_quality":[112,80,64,32,16],"video_codecid":7,"seek_param":"start","seek_type":"offset","dash":{"duration":230,"minBufferTime":1.5,"min_buffer_time":1.5,"video":[{"id":32,"baseUrl":

  请求到页面源代码后,解析提取“playinfo”即视频链接项,使用正则表达式(python中re库)进行提取。
  利用json库将提取数据转化为字典数据,并利用pprint库进行格式化输出进行分析 。

  数据中包含视频和音频两种内容,故b站的视频和音频是分开的,我们都要下载下来,然后用其他工具合成。
  上面已经把提取数据转化为字典,然后利用字典找到音频audio_url 和视频地址video_url。

5. 音频、视频下载

	audio_content = session.get(audio_url, headers=headers).content  # 音频二进制内容
    video_content = session.get(video_url, headers=headers).content  # 视频二进制内容
    with open(r'D:\documents\python\daily\download/' + title + '.mp3', 'wb') as f:
        f.write(audio_content)
    with open(r'D:\documents\python\daily\download/' + title + '.mp4', 'wb') as f:
        f.write(video_content)

  请求音频和视频地址,并下载下来。

6. 合并音频与视频

from moviepy.editor import *


def merge(title):
    video_path = title + '.mp4'
    audio_path = title + '.mp3'
    # 提取音轨
    audio = AudioFileClip(audio_path)
    # 读入视频
    video = VideoFileClip(video_path)
    # 将音轨合并到视频中
    video = video.set_audio(audio)
    # 输出
    video.write_videofile(f"{title}(含音频).mp4")

调用

	merge(title)
    print('有音频视频处理完成')

7. 完整代码

# -*- coding : UTF-8 -*-
# @file   : download_bilibili.py
# @Time   : 2024/8/26 0026 7:51
# @Author : Administrator


import pprint
import requests
import re
import json
from moviepy.editor import *


def merge(title):
    video_path = title + '.mp4'
    audio_path = title + '.mp3'
    # 提取音轨
    audio = AudioFileClip(audio_path)
    # 读入视频
    video = VideoFileClip(video_path)
    # 将音轨合并到视频中
    video = video.set_audio(audio)
    # 输出
    video.write_videofile(f"{title}(含音频).mp4")


if __name__ == "__main__":
    session = requests.session()
    url = 'https://www.bilibili.com/video/BV1Um411r7gW/?spm_id_from=333.337.search-card.all.click&vd_source=148afb6cb7e28daa45a2f426a0dec4ee'
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.37',
        "Referer": "https://www.bilibili.com"}
    resp = session.get(url, headers=headers)
    # print(resp.text)
    title = re.findall(r'<title data-vue-meta="true">(.*?)_哔哩哔哩_bilibili', resp.text)[0]
    play_info = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]

    '''print(title)
    print(play_info,type(play_info))'''
    json_data = json.loads(play_info)
    # pprint.pprint(json_data) #格式化输出,便于观看
    # print(type(json_data))
    audio_url = json_data['data']['dash']['audio'][0]['backupUrl'][0]  # 音频地址 [0]清晰度最高
    video_url = json_data['data']['dash']['video'][0]['backupUrl'][0]  # 视频地址

    audio_content = session.get(audio_url, headers=headers).content  # 音频二进制内容
    video_content = session.get(video_url, headers=headers).content  # 视频二进制内容
    with open(r'D:\documents\python\daily\download/' + title + '.mp3', 'wb') as f:
        f.write(audio_content)
    with open(r'D:\documents\python\daily\download/' + title + '.mp4', 'wb') as f:
        f.write(video_content)
    merge(title)
    print('有音频视频处理完成')

  将视频下载到本地后,无论是添加到Office的PPT中还是WPS的PPT中都很方便,但是遇到WPS的PPT有文件大小限制,所以还是使用了Office的PPT。

参考:用Python制作一个B站视频下载小工具(文末附完整代码)
参考:bilibili视频合集下载,python实现

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

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

相关文章

搭建自己的GPT

搭建自己的GPT 文章说明核心代码效果展示源码下载 文章说明 目前GPT的使用比较主流&#xff0c;现有开源大模型&#xff0c;可以拉取到本地进行部署&#xff0c;搭建属于自己的GPT对话工具&#xff1b;主要用于熟悉大模型的本地搭建&#xff1b;本文采用开源的Ollama进行服务提…

MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL

#{}和${}区别&#xff1a; #{}&#xff1a;是占位符&#xff0c;采用预编译的方式sql中传值&#xff0c;防止sql注入&#xff0c;如果我们往sql中列值传递一般使用 #{}。 ${}&#xff1a;采用字符串拼接的方式直接拼接到sql语句中&#xff0c;一般不用于sql列值传递&#xf…

高可用 Go 服务开发

高可用的含义是尽量减少服务的不可用&#xff08;日常维护或者突发系统故障&#xff09;时长&#xff0c;提升服务的可用时长。如何衡量一个服务的可用性呢&#xff1f;或许你也听说过&#xff0c;通常企业可能会要求服务的可用性能能够达到三个 9(也就是 99.9%)或者 4个 9 &am…

C# 自动化抢购脚本:基于商品链接的实现方案

实现思路&#xff1a; 启动参数: options.AddArgument("start-maximized"); 用于启动浏览器时使其窗口最大化。 创建 EdgeDriver 实例: EdgeDriver driver new EdgeDriver(options); 用于初始化 WebDriver 实例。导航到 URL: driver.Navigate().GoToUrl("请输入…

详谈进程等待

目录 前言1. 进程等待的必要性1.1 进程等待的定义 2. 如何进行进程等待2.1 wait 单进程2.2 wait 多进程2.3 status && 退出情况2.3.1 status 参数构成2.3.2 简证 status 参数构成2.3.3 进程等待失败2.3.4 宏调用查看退出信息 3. 进程等待的原理 前言 本篇文章继上一篇…

一款免费且功能强大的图像查看和编辑软件

IrfanView是一款免费且功能强大的图像查看和编辑软件&#xff0c;以其小巧的体积、快速的运行速度和丰富的功能而闻名。它不仅支持多种图像格式&#xff0c;如JPEG、PNG、BMP、GIF等&#xff0c;还支持视频和音频文件的播放。 IrfanView的主要特点包括&#xff1a; 广泛的文件…

Tomcat启动过程是怎么样的?

一、Tomcat 启动流程 步骤&#xff1a; 1、启动tomcat&#xff0c;需要调用 bin/startup.bat (在linux 目录下&#xff0c;需要调用 bin/startup.sh)&#xff0c;在startup.bat 脚本中&#xff0c;调用了catalina.bat。 2、在catalina.bat 脚本文件中&#xff0c;调用了BootS…

【栈与递归】-------简单了解

1.递归的定义&#xff1a; 若一个对象部分地包含它自己&#xff0c;或用它自己给自己定义&#xff0c;则称这个对象是递归的 例如&#xff1a; 链表的结构&#xff0c;树的结构等等 若一个过程直接地或间接地调用自己&#xff0c; 则称这个过程是递归的过程。 例如&#xf…

不确定性环境下的自动驾驶汽车行为决策方法

在高度交互的复杂驾驶环境中考虑不确定性因素的影响&#xff0c;做出合理的决策&#xff0c;是当前决策规划系统须解决的主要问题之一。本文提出了一种不确定性环境下的自动驾驶汽车行为决策方法&#xff0c;为消除不确定性的影响&#xff0c;将行为决策过程转化为部分可观察马…

如何使用ssm实现基于jsp的快递管理系统的开发

TOC ssm226基于jsp的快递管理系统的开发jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

达梦数据库的系统视图v$db_object_cache

达梦数据库的系统视图v$db_object_cache 达梦数据库&#xff08;DM Database&#xff09;中的 V$DB_OBJECT_CACHE 视图提供了数据库对象缓存的相关信息。这些信息包括缓存中的各种数据库对象&#xff08;如表、索引、存储过程等&#xff09;的具体状态和属性。通过 V$DB_OBJEC…

基于SpringBoot的滴答拍摄影项目

你好&#xff0c;我是计算机专业的学生&#xff0c;专注于摄影项目的开发与实现。如果您对我的项目感兴趣或有任何建议&#xff0c;欢迎随时联系我。 开发语言 Java 数据库 MySQL 技术 SpringBoot框架 工具 MyEclipse、Tomcat服务器 系统展示 首页 管理员功能模块 用…

网络安全-安全渗透简介和安全渗透环境准备

文章目录 前言1. 安全渗透简介1.1 什么是安全渗透&#xff1f;1.2 安全渗透所需的工具1.3 渗透测试流程 2. 使用 Kali Linux 进行安全渗透2.1 下载ISO镜像2.2 下载VMware Workstaion软件2.3 Kali Linux简介2.4 准备Kali Linux环境2.5 Kali Linux初始配置2.6 VIM鼠标右键无法粘贴…

石碑文字全排列重组(华为od机考题)

一、题目 1.原题 有一个考古学家发现一个石碑&#xff0c; 但是很可惜&#xff0c;发现时其已经断成多段&#xff0c; 原地发现n个断口整齐的石碑碎片。 为了破解石碑内容&#xff0c; 考古学家希望有程序能帮忙计算复原后的石碑文字组合数&#xff0c; 你能帮忙吗&#xff1…

C# 三种定时器的用法

目录 1.System.Timers.Timer 2.System.Windows.Forms.Timer 3.System.Threading.Timer 4.简单的封装 这里介绍三种常用的定时器&#xff0c;方便查阅资料或直接复制使用。 1.System.Timers.Timer System.Timers.Timer 类定义了一个计时器&#xff0c;该计时器按固定间隔触…

大二必做项目贪吃蛇超详解之上篇win32库介绍

文章目录 1. 游戏背景2. 游戏效果演示3. 项目目标4. 前置知识5. Win32 API5. 1 控制台程序(Console)5. 2 控制台屏幕上的坐标 COORD5. 3 GetStdHandle5. 4 GetConsoleCursorlnfo5. 4. 1 CONSOLE_CURSOR_INFO5. 4. 2 SetConsoleCursorlnfo 5. 5 SetconsoleCursorPosition5. 6 Ge…

“汤姆猫除了不会捉杰瑞啥都会”之作为Web服务器,tomcat的常用部署方式 (Tomcat+memcached实现高可用)

目录 企业级WEB应用服务器TOMCAT一、tomcat的功能介绍1.1 安装 Tomcat1.2 tomcat的文件结构和组成1.3 生成tomcat的启动文件 二、结合反向代理实现tomcat部署2.1 常见部署方式介绍2.2 利用 nginx 反向代理实现2.3 实现tomcat中的负载均衡2.3.1 HTTP的无状态&#xff0c;有连接和…

Linux驱动学习之中断与等待队列

本篇分为设备树部分和API接口部分 设备树 想要使用中断&#xff0c;设备树中需要有两个属性&#xff1a; interrupts // 表示要使用哪一个中断, 中断的触发类型等等。 interrupt-parent // 这个中断要接到哪一个设备去? 即父中断控制器是谁 父中…

一种更快成像的新技术

斯旺西大学&#xff08;Swansea University&#xff09;的研究人员为中性原子束显微镜创造了一种新的成像方法&#xff0c;可大大加快显微镜图像的获取速度。中性原子束显微镜已成为科学研究的一个重点&#xff0c;因为它能够对商用显微镜无法成像的表面进行成像&#xff0c;例…

mysql集群从零开始搭建

文章目录 MySQL集群linux下部署mysqlmysql主从复制master配置配置slave新的slave加入延迟复制慢查询多线程原理 半同步模式原理gat模式启动半同步模式 mysql高可用之组复制&#xff08;MGR&#xff09;实现mysql组复制 mysql路由具体实现 mysql高可用之MHAMHA部署实施安装MHA软…