下载B站视频作为PPT素材

news/2024/9/13 22:49:47/ 标签: 爬虫

下载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 : Administratorimport 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.ppmy.cn/news/1516274.html

相关文章

【C++算法/学习】位运算详解

✨ 忍能对面不相识&#xff0c;仰面欲语泪现流 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;算法学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

Spring MVC (面试篇)

目录 什么是Spring MVC&#xff1f; 简单介绍下你对Spring MVC的理解&#xff1f; SpringMVC的优点 Spring MVC的主要组件&#xff1f; Spring MVC常用的注解由哪些&#xff1f; Controller注解的作用 加油兄弟们 &#xff01; &#xff01; ! 什么是Spring MVC&#xff1…

HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行

目录 HAL库&#xff1a;中断 方式按键检测&#xff1a;抬起执行、按下执行、长按短按检测、延时执行 注意事项&#xff1a; 初始化部分&#xff1a; 回调函数部分 HAL库&#xff1a;中断 方式按键检测&#xff1a;抬起执行、按下执行、长按短按检测、延时执行 注意事项&am…

《黑神话·悟空》:国产3A大作背后是用什么语言开发的?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 近年来&#xff0c;国产游戏产业发展迅速&#xff0c;涌现出了许多优秀的作品。《黑神话悟空》作为一款备受瞩…

LeetCode Hot100:128、最长连续序列

题目&#xff1a;最长连续序列 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 方案一&#xff1a;哈希表 class Solution { public…

用爬虫玩转石墨文档细解

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 石墨文档是一款受欢迎的在线协作工具&#xff0c;它允许多人实时编辑和共享文档。通过爬虫技术&#xff0c;我们可以自动化地获取石墨文档中的内容&#xff0c;进行数据分析或备份。不过&#xff0c;在使用爬虫技术时&a…

Python 爬虫入门(十二):正则表达式「详细介绍」

Python 爬虫入门&#xff08;十二&#xff09;&#xff1a;正则表达式 前言一、正则表达式的用途二、正则表达式的基本组成元素2.1 特殊字符2.2 量词2.3 位置锚点2.4 断言2.5 字符集2.6 字符类2.6.1 基本字符类2.6.2 常见字符类简写2.6.3 POSIX字符类2.6.4 组合使用 三、 正则表…

DVWA靶场通关(CSRF)

CSRF 是跨站请求伪造&#xff0c;是指利用受害者尚未失效的身份认证信息&#xff08;cookie、会话等&#xff09;&#xff0c;诱骗其点击恶意链接或者访问包含攻击代码的页面&#xff0c;在受害人不知情的情况下以受害者的身份向&#xff08;身份认证信息所对应的&#xff09;服…

第七章 项目布局实现(7.4.4)——全屏功能

7.4.4 全屏功能 全屏功能通过 VueUse 实现。VueUse 基于 Vue 组合式 API 的实用工具集,功能非常丰富。 官网:https://vueuse.org/ 安装 npm i @vueuse/core当前 package.json 文件: {"name": "yumi-admin","private":

前端宝典十五:设计模式之前端开发5大设计原则

本文主要探讨前端开发设计原则&#xff1a; 单一职责原则 开闭原则 里氏替换原则 接口隔离原则 依赖倒置原则 一、单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09; 1、介绍&#xff1a; 一个类应该只有一个引起它变化的原因。这意味着…

基于Modbus的MFC智能控制

1. 系统概述 利用LabVIEW通过Modbus 485协议实现对七星&#xff08;Sevenstar&#xff09;品牌质量流量控制器&#xff08;MFC&#xff09;的智能化控制。该系统将自动控制多个MFC的流速&#xff0c;实时监控其状态&#xff0c;并根据需要进行调整。 2. 硬件配置 MFCs: 七星品…

Python和MATLAB梯度下降导图

&#x1f3af;要点 寻找局部最小值普通最小二乘法和随机梯度下降的动量线性回归媒体广告销售光学字符识别和最小化均方误差男女医疗费用最快速下降方向函数优化等高线图可视化共轭梯度下降可视化损失函数、动量、涅斯特洛夫动量、权衰减量化不确定性拓扑结构算法分类中权重归一…

SE11 没有激活的名称表存 No active nametab exists for

背景&#xff1a; SE11中减少某个非空表的字段的长度后&#xff0c;在SE14中的操作不当&#xff0c;并且对该表进行了删除重建的操作后&#xff0c;发生SE11激活该表报错。 原因&#xff1a; 出现了一些未知原因&#xff0c;导致该表在底层数据库存在&#xff0c;但是运行时对…

cpu steal非常高

steal代表非自愿等待&#xff0c;这个值出现说明服务器cpu争用很严重&#xff0c;cpu资源不足 ctxt&#xff0c;这个值代表cpu上下文切换次数/proc/stat 是一个伪文件系统&#xff08;procfs&#xff09;中的文件&#xff0c;它提供了系统级别的统计信息。这个文件包含了CPU使用…

Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例

1. 安装elasticsearchik分词器插件 sudo wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip sudo mkdir -p ./es_plugins/analysis-ik sudo mkdir ./es_data sudo unzip elasticsearch-analysis-ik-8.13.4.zip -d ./es_plugins/a…

数据结构-全部由1组成的子矩形数量

给定一个二维数组matrix, 其中的值不是0就是1&#xff0c; 返回全部由1组成的子矩形数量。 import java.util.Stack;public class CountSubmatricesWithAllOnes {public static void main(String[] args) {int[][] mat {{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1}};System.o…

腾讯云是什么?为什么选择它?

腾讯云是什么&#xff1f; 腾讯云&#xff08;Tencent Cloud&#xff09;是全球领先的云计算服务提供商&#xff0c;凭借其强大的技术实力和丰富的行业经验&#xff0c;腾讯云为全球超过100万用户提供稳定、可靠、高效的云计算服务。无论是初创企业&#xff0c;还是大型企业&a…

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes[1. 官网](https://kubernetes.io/zh-cn/)--------------------------------------------------------------------------------------------------------一. 章节简介 二. DevOps 1. 简介 2. CICD

element表格导出

element表格导出 使用了xlsx插件做表格下载 1、首先安装xlsx插件 import XLSX from ‘xlsx’ 2、在el-table上添加ref 3、导出方法 downloadFun() {const tableElement this.$refs.table.$elconst ws XLSX.utils.table_to_sheet(tableElement)// 创建工作簿并添加工作表…

Mybatis--其他查询操作和数据库连接池(下下)

序 准备工作&#xff1a; mysql数据库和表的信息更新&#xff1a; DROP TABLE IF EXISTS articleinfo;CREATE TABLE articleinfo (id INT PRIMARY KEY auto_increment,title VARCHAR ( 100 ) NOT NULL,content TEXT NOT NULL,uid INT NOT NULL,delete_flag TINYINT ( 4 ) DEF…