爬虫基础之爬取某站视频
目标网址:为了1/4螺口买小米SU7,开了一个月,它值吗?_哔哩哔哩_bilibili
| requests (发送HTTP请求) | subprocess(执行系统命令) |
| re (正则表达式操作) | json (处理JSON数据) |

需求分析:
- 视频的名称 F12 打开开发者工具 or 右击点检查
- 分析包含视频下载链接的数据包
- 发送请求 解析数据 下载到本地
打开开发者工具 刷新页面 等待数据包的加载
点击网络(network)下面的媒体 此筛选的为视频文件 发现没有数据包返回

接着我们点击XHR 动态加载数据 --- 左边的.m4都为视频文件 点击一个数据包 复制里面url的一段参数 找到总的接口

搜索出来有很多一样的数据包 就是刚刚看到的 找到唯一不同的接口
这里面有我们想要的视频名字和下载链接

接着点击响应 Ctrl+F 打开快捷键搜索 所需要的视频名称

往下拉 下面有视频下载地址 和音频下载地址
# Explain: B站的视频和音频是分开的 我们可以通过下载一个软件来合并 或者通过剪视频软件合成

分析完毕,开始写代码
第一步 模拟浏览器向服务器发送请求
- 复制标头中的请求URL地址
- 构建请求头
- 提取数据
- 保存数据
#导包
import requestsurl = 'https://www.bilibili.com/video/BV1Cw4m1U7kS/?spm_id_from=333.337.search-card.all.click&vd_source=bc0862702cb8c55fb7829d6676ee3f45'headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0','referer':'https://www.bilibili.com/'
}
resp = requests.get(url=url, headers=headers)
提取数据 --使用正则提取 视频标题
# 导包
import re
# 获取视频名称 对列表取值
v_name = re.findall(r'<title data-vue-meta="true">(.*?)_哔哩哔哩_bilibili</title>', resp.text)[0].replace('?', '').replace('/', '')
上图的代码 可以通过 pprint.pprint(content) 格式化打印 方便取值
content = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]
# 将获取到的数据转换为JSON格式的
json_data = json.loads(content)
# 通过键值对取值 提取视频 音频的下载链接
a_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]
v_url = json_data["data"]["dash"]["video"][0]["baseUrl"]
保存数据 --发送请求获取二进制的数保存到本地
# 图片 视频 音频等都是以二进制的格式保存
a_content = requests.get(url=a_url, headers=headers).content
v_content = requests.get(url=v_url, headers=headers).content
with open(v_name+'.mp3', 'wb') as f:f.write(a_content)
with open(v_name+'.mp4', 'wb') as f:f.write(v_content)

视频和音频保存完毕 接着就是将其合并
进入这个官网 下载软件并解压 然后配置环境变量 Builds - CODEX FFMPEG @ gyan.dev
往下拉 找到release builds 下载如下图箭头的zip压缩包

然后找到解压缩的文件 复制到bin目录 例如我的是 C:\下载\ffmpeg-7.0.2-essentials_build\bin
右击此电脑的属性 高级系统设置



添加到环境变量中就可以了

#导包
import subprocess
def combine_audio_video(video_path, audio_path, output_path):# 使用 subprocess 模块调用 ffmpeg 命令行工具,避免 shell 命令注入风险command = ['ffmpeg', '-i', video_path, '-i', audio_path, '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', output_path]subprocess.run(command)# 提供视频和音频的文件路径
video_path = '为了14螺口买小米SU7,开了一个月,它值吗.mp4'
audio_path = '为了14螺口买小米SU7,开了一个月,它值吗.mp3'
output_path = 'all.mp4'
combine_audio_video(video_path, audio_path, output_path)
出现这串代码时 就合并成功啦

以下是本次的源码 供大家参考学习使用
import json
import pprint
import re
import requests
import subprocessurl = 'https://www.bilibili.com/video/BV1Cw4m1U7kS/?spm_id_from=333.337.search-card.all.click&vd_source=bc0862702cb8c55fb7829d6676ee3f45'headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0','referer':'https://www.bilibili.com/'
}
resp = requests.get(url=url, headers=headers)
# 获取视频名称 对列表取值
v_name = re.findall(r'<title data-vue-meta="true">(.*?)_哔哩哔哩_bilibili</title>', resp.text)[0].replace('?','').replace('/', '')content = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]
json_data = json.loads(content)
a_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]
v_url = json_data["data"]["dash"]["video"][0]["baseUrl"]
a_content = requests.get(url=a_url, headers=headers).content
v_content = requests.get(url=v_url, headers=headers).content# with open(v_name+'.mp3', 'wb') as f:
# f.write(a_content)
# with open(v_name+'.mp4', 'wb') as f:
# f.write(v_content)def combine_audio_video(video_path, audio_path, output_path):# 使用 subprocess 模块调用 ffmpeg 命令行工具,避免 shell 命令注入风险command = ['ffmpeg', '-i', video_path, '-i', audio_path, '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', output_path]subprocess.run(command)video_path = '为了14螺口买小米SU7,开了一个月,它值吗.mp4'
audio_path = '为了14螺口买小米SU7,开了一个月,它值吗.mp3'
output_path = 'all.mp4'
combine_audio_video(video_path, audio_path, output_path)
本次的案例分析就到此结束啦 感谢大家的观看 您的点赞和关注是我更新的动力
相关文章:
爬虫基础之爬取某站视频
目标网址:为了1/4螺口买小米SU7,开了一个月,它值吗?_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…...
mongoDB常见指令
即使我们自己开发用不到mongoDB,但是接手别人项目的时候,别人如果用了,我们也要会简单调试一下 虽然mongoDB用的不是sql语句,但语句的逻辑都是相似的,比如查看数据库、数据表,增删改查这些 我们下面以doc…...
人工智能之深度学习_[5]-神经网络优化学习率衰减优化正则化方法
文章目录 神经网络入门二3 神经网络优化方法3.1 梯度下降算法回顾3.2 反向传播(BP算法)3.2.1 反向传播概念3.2.2 反向传播详解 3.3 梯度下降优化方法3.3.1 指数加权平均3.3.2 动量算法Momentum3.3.3 AdaGrad3.3.4 RMSProp3.3.5 Adam3.3.6 小结 4 学习率衰…...
Oracle之Merge into函数使用
Merge into函数为Oracle 9i添加的语法,用来合并update和insert语句。所以也经常用于update语句的查询优化: 一、语法格式: merge into A using B on (A.a B.a) --注意on后面带括号,且不能更新join的字段 when matched then upd…...
深度解析:哪种心磁图技术是心脏检查的精准之选?
在全球心血管疾病的阴影日益笼罩的今天,医学界正积极寻求一种无损、无创、无辐射的心脏健康监测方式。心磁图仪(MCG),这一前沿技术,凭借其独特的优势,悄然成为心脏电磁功能监测的新星。它不仅为心肌缺血、心…...
SpringBoot--基本使用(配置、整合SpringMVC、Druid、Mybatis、基础特性)
这里写目录标题 一.介绍1.为什么依赖不需要写版本?2.启动器(Starter)是何方神圣?3.SpringBootApplication注解的功效?4.启动源码5.如何学好SpringBoot 二.SpringBoot3配置文件2.1属性配置文件使用2.2 YAML配置文件使用2.3 YAML配置文件使用2.…...
单片机-STM32 IIC通信(OLED屏幕)(十一)
一、屏幕的分类 1、LED屏幕: 由无数个发光的LED灯珠按照一定的顺序排列而成,当需要显示内容的时候,点亮相关的LED灯即可,市场占有率很高,主要是用于户外,广告屏幕,成本低。 LED屏是一种用发光…...
观察者模式 - 观察者模式的应用场景
引言 观察者模式(Observer Pattern)是设计模式中行为型模式的一种,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。观察者模式广泛应用于事件处理系统…...
【C++】详细讲解继承(下)
本篇来继续说说继承。上篇可移步至【C】详细讲解继承(上) 1.继承与友元 友元关系不能继承 ,也就是说基类友元不能访问派⽣类私有和保护成员。 class Student;//前置声明class Same //基类 { public:friend void Fun(const Same& p, con…...
消息队列篇--原理篇--Pulsar(Namespace,BookKeeper,类似Kafka甚至更好的消息队列)
Apache Pulusar是一个分布式、多租户、高性能的发布/订阅(Pub/Sub)消息系统,最初由Yahoo开发并开源。它结合了Kafka和传统消息队列的优点,提供高吞吐量、低延迟、强一致性和可扩展的消息传递能力,适用于大规模分布式系…...
扬帆数据结构算法之舟,启航C++探索征途——LeetCode深度磨砺:顺序表技术精进实践
人无完人,持之以恒,方能见真我!!! 共同进步!! 文章目录 顺序表练习1.移除数组中指定的元素方法1(顺序表)方法2(双指针) 2.删除有序数组中的重复项…...
基于本地事务表+MQ实现分布式事务
基于本地事务表MQ实现分布式事务 引言1、原理2、本地消息表优缺点3、代码实现3.1、代码执行流程3.2、项目结构3.3、项目源码 引言 本地消息表的方案最初由ebay的工程师提出,核心思想是将分布式事务拆分成本地事务进行处理。本地消息表实现最终一致性。本文主要学习…...
数据结构:二叉树—面试题(一)
目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/https://leetcode.cn/problems/same-tree/description/ 描述:…...
【Wordpress网站制作】切换语言的问题
前言 自学笔记,解决问题为主,欢迎补充。 本文重点:如何将页面语言从默认的【英语】修改成【中文】。 问题描述 安装完wordpress,在【Setting】→【General】的语言中,选项只有英语。无法切换成中文 方法1: 在 wp-c…...
【第二天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-五种常见的排序算法(持续更新)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的排序算法1.排序算法的介绍2.五种详细的排序算法代码 总结 前言 提示:这里可以添加本文要记…...
Neural networks 神经网络
发展时间线 基础概念 多层神经网络结构 神经网络中一个网络层的数学表达 TensorFlow实践 创建网络层 神经网络的创建、训练与推理 推理 推理可以理解为执行一次前向传播 前向传播 前向传播直观数学表达 前向传播直观数学表达的Python实现 前向传播向量化实现 相关数学知识…...
汽车免拆诊断案例 | 2007 款日产天籁车起步加速时偶尔抖动
故障现象 一辆2007款日产天籁车,搭载VQ23发动机(气缸编号如图1所示,点火顺序为1-2-3-4-5-6),累计行驶里程约为21万km。车主反映,该车起步加速时偶尔抖动,且行驶中加速无力。 图1 VQ23发动机…...
代码随想录day3
203:移除链表元素:注意虚拟头节点的使用 ListNode* removeElements(ListNode* head, int val) {ListNode* result new ListNode();result->next head;ListNode* current result;while(current ! nullptr && current->next ! nullptr){if(current-…...
Spring 面试题【每日20道】【其一】
1、Spring 当中什么是循环依赖(常问)? 中等 在Spring框架中,循环依赖(Circular Dependency)是指两个或多个bean互相之间直接或间接地依赖对方的注入。例如: A bean依赖于B bean。B bean又依赖…...
leetcode刷题记录(八十九)——35. 搜索插入位置
(一)问题描述 35. 搜索插入位置 - 力扣(LeetCode)35. 搜索插入位置 - 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位…...
Qwen3-TTS作品分享:听AI朗读你的日记、诗歌和故事
Qwen3-TTS作品分享:听AI朗读你的日记、诗歌和故事 1. 为什么你需要一个会"读心"的语音合成工具 想象一下这样的场景:深夜写完日记,点击播放键,听到一个温暖的声音将你的文字娓娓道来;创作完一首诗…...
nli-distilroberta-base参数解析与调优指南:关键配置项详解
nli-distilroberta-base参数解析与调优指南:关键配置项详解 1. 引言 如果你正在使用nli-distilroberta-base模型进行自然语言推理任务,可能会遇到这样的困惑:为什么同样的模型在不同机器上运行速度差异这么大?为什么有时候推理结…...
NHSE完全指南:3步掌握动物森友会存档编辑器的核心功能
NHSE完全指南:3步掌握动物森友会存档编辑器的核心功能 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE(Animal Crossing: New Horizons Save Editor)是一款…...
突破性AMD Ryzen硬件调试方案:SMUDebugTool深度解析与实战指南
突破性AMD Ryzen硬件调试方案:SMUDebugTool深度解析与实战指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...
Pixel Couplet Gen应用场景:微信小程序开发者如何复用像素皇城UI组件
Pixel Couplet Gen应用场景:微信小程序开发者如何复用像素皇城UI组件 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的创新应用。作为微信小程序开发者,您可以直接复用其UI组件库,快速构建具有以下特点的应…...
Arcgis符号化实战:用矢量文件制作专业级统计地图(附最新配色方案)
ArcGIS符号化实战:用矢量文件制作专业级统计地图(附最新配色方案) 当你面对一叠枯燥的表格数据时,是否想过如何让这些数字"活"起来?统计地图正是将抽象数据转化为直观视觉表达的利器。作为地理信息系统领域的…...
springboot+vue基于web的在线学习资源推荐的设计与实现
目录功能模块分析推荐系统功能交互功能设计后台管理功能技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作功能模块分析 用户管理模块 用户注册与登录:支持邮箱/手机号注册,提供密码找回功能…...
从电子管到全固态:中波广播发射机核心技术演进与选型指南
1. 中波广播发射机的前世今生 第一次见到中波发射机是在十年前参观某省级广播电台时,那座两层楼高的电子管设备让我印象深刻——嗡嗡作响的风扇、散发着热量的金属外壳、闪烁着微光的电子管,活像科幻电影里的场景。如今这种"大家伙"已经逐渐被…...
STEP3-VL-10B实际作品集:MMBench 92.05分视觉识别能力高清图文输出示例
STEP3-VL-10B实际作品集:MMBench 92.05分视觉识别能力高清图文输出示例 1. 引言:当AI“看懂”了世界 你有没有想过,让AI像人一样“看懂”一张图片,到底有多难? 这不仅仅是识别出图片里有什么东西那么简单。比如给你…...
华为欧拉系统(openEuler 22.03 LTS)上,用Docker Compose V2部署你的第一个微服务项目
华为欧拉系统实战:用Docker Compose V2部署微服务全流程指南 在国产操作系统浪潮中,华为欧拉(openEuler)正成为企业级应用的新选择。当开发者需要在ARM架构的欧拉系统上部署现代微服务时,Docker Compose V2提供了轻量级…...
