当前位置: 首页 > news >正文

爬虫基础之爬取某站视频

目标网址:为了1/4螺口买小米SU7,开了一个月,它值吗?_哔哩哔哩_bilibili

本案例所使用到的模块
requests (发送HTTP请求)subprocess(执行系统命令)
re (正则表达式操作)json (处理JSON数据)


需求分析:

  1. 视频的名称  F12 打开开发者工具 or 右击点检查
  2. 分析包含视频下载链接的数据包
  3. 发送请求  解析数据  下载到本地

打开开发者工具 刷新页面 等待数据包的加载
点击网络(network)下面的媒体 此筛选的为视频文件 发现没有数据包返回

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

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

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


 

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

分析完毕,开始写代码

第一步 模拟浏览器向服务器发送请求
       

  1. 复制标头中的请求URL地址
  2. 构建请求头
  3. 提取数据
  4. 保存数据
#导包
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&#xff0c;开了一个月&#xff0c;它值吗&#xff1f;_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…...

mongoDB常见指令

即使我们自己开发用不到mongoDB&#xff0c;但是接手别人项目的时候&#xff0c;别人如果用了&#xff0c;我们也要会简单调试一下 虽然mongoDB用的不是sql语句&#xff0c;但语句的逻辑都是相似的&#xff0c;比如查看数据库、数据表&#xff0c;增删改查这些 我们下面以doc…...

人工智能之深度学习_[5]-神经网络优化学习率衰减优化正则化方法

文章目录 神经网络入门二3 神经网络优化方法3.1 梯度下降算法回顾3.2 反向传播&#xff08;BP算法&#xff09;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添加的语法&#xff0c;用来合并update和insert语句。所以也经常用于update语句的查询优化&#xff1a; 一、语法格式&#xff1a; merge into A using B on (A.a B.a) --注意on后面带括号&#xff0c;且不能更新join的字段 when matched then upd…...

深度解析:哪种心磁图技术是心脏检查的精准之选?

在全球心血管疾病的阴影日益笼罩的今天&#xff0c;医学界正积极寻求一种无损、无创、无辐射的心脏健康监测方式。心磁图仪&#xff08;MCG&#xff09;&#xff0c;这一前沿技术&#xff0c;凭借其独特的优势&#xff0c;悄然成为心脏电磁功能监测的新星。它不仅为心肌缺血、心…...

SpringBoot--基本使用(配置、整合SpringMVC、Druid、Mybatis、基础特性)

这里写目录标题 一.介绍1.为什么依赖不需要写版本&#xff1f;2.启动器(Starter)是何方神圣&#xff1f;3.SpringBootApplication注解的功效&#xff1f;4.启动源码5.如何学好SpringBoot 二.SpringBoot3配置文件2.1属性配置文件使用2.2 YAML配置文件使用2.3 YAML配置文件使用2.…...

单片机-STM32 IIC通信(OLED屏幕)(十一)

一、屏幕的分类 1、LED屏幕&#xff1a; 由无数个发光的LED灯珠按照一定的顺序排列而成&#xff0c;当需要显示内容的时候&#xff0c;点亮相关的LED灯即可&#xff0c;市场占有率很高&#xff0c;主要是用于户外&#xff0c;广告屏幕&#xff0c;成本低。 LED屏是一种用发光…...

观察者模式 - 观察者模式的应用场景

引言 观察者模式&#xff08;Observer Pattern&#xff09;是设计模式中行为型模式的一种&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;使得当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会自动收到通知并更新。观察者模式广泛应用于事件处理系统…...

【C++】详细讲解继承(下)

本篇来继续说说继承。上篇可移步至【C】详细讲解继承&#xff08;上&#xff09; 1.继承与友元 友元关系不能继承 &#xff0c;也就是说基类友元不能访问派⽣类私有和保护成员。 class Student;//前置声明class Same //基类 { public:friend void Fun(const Same& p, con…...

消息队列篇--原理篇--Pulsar(Namespace,BookKeeper,类似Kafka甚至更好的消息队列)

Apache Pulusar是一个分布式、多租户、高性能的发布/订阅&#xff08;Pub/Sub&#xff09;消息系统&#xff0c;最初由Yahoo开发并开源。它结合了Kafka和传统消息队列的优点&#xff0c;提供高吞吐量、低延迟、强一致性和可扩展的消息传递能力&#xff0c;适用于大规模分布式系…...

扬帆数据结构算法之舟,启航C++探索征途——LeetCode深度磨砺:顺序表技术精进实践

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 顺序表练习1.移除数组中指定的元素方法1&#xff08;顺序表&#xff09;方法2&#xff08;双指针&#xff09; 2.删除有序数组中的重复项…...

基于本地事务表+MQ实现分布式事务

基于本地事务表MQ实现分布式事务 引言1、原理2、本地消息表优缺点3、代码实现3.1、代码执行流程3.2、项目结构3.3、项目源码 引言 本地消息表的方案最初由ebay的工程师提出&#xff0c;核心思想是将分布式事务拆分成本地事务进行处理。本地消息表实现最终一致性。本文主要学习…...

数据结构:二叉树—面试题(一)

目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/https://leetcode.cn/problems/same-tree/description/ 描述&#xff1a…...

【Wordpress网站制作】切换语言的问题

前言 自学笔记&#xff0c;解决问题为主&#xff0c;欢迎补充。 本文重点&#xff1a;如何将页面语言从默认的【英语】修改成【中文】。 问题描述 安装完wordpress&#xff0c;在【Setting】→【General】的语言中&#xff0c;选项只有英语。无法切换成中文 方法1: 在 wp-c…...

【第二天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-五种常见的排序算法(持续更新)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的排序算法1.排序算法的介绍2.五种详细的排序算法代码 总结 前言 提示&#xff1a;这里可以添加本文要记…...

Neural networks 神经网络

发展时间线 基础概念 多层神经网络结构 神经网络中一个网络层的数学表达 TensorFlow实践 创建网络层 神经网络的创建、训练与推理 推理 推理可以理解为执行一次前向传播 前向传播 前向传播直观数学表达 前向传播直观数学表达的Python实现 前向传播向量化实现 相关数学知识…...

汽车免拆诊断案例 | 2007 款日产天籁车起步加速时偶尔抖动

故障现象  一辆2007款日产天籁车&#xff0c;搭载VQ23发动机&#xff08;气缸编号如图1所示&#xff0c;点火顺序为1-2-3-4-5-6&#xff09;&#xff0c;累计行驶里程约为21万km。车主反映&#xff0c;该车起步加速时偶尔抖动&#xff0c;且行驶中加速无力。 图1 VQ23发动机…...

代码随想录day3

203:移除链表元素&#xff1a;注意虚拟头节点的使用 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 当中什么是循环依赖&#xff08;常问&#xff09;&#xff1f; 中等 在Spring框架中&#xff0c;循环依赖&#xff08;Circular Dependency&#xff09;是指两个或多个bean互相之间直接或间接地依赖对方的注入。例如&#xff1a; A bean依赖于B bean。B bean又依赖…...

leetcode刷题记录(八十九)——35. 搜索插入位置

&#xff08;一&#xff09;问题描述 35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09;35. 搜索插入位置 - 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位…...

Flutter 与 React 前端框架对比:深入分析与实战示例

Flutter 与 React 前端框架对比&#xff1a;深入分析与实战示例 在现代前端开发中&#xff0c;Flutter 和 React 是两个非常流行的框架。Flutter 是 Google 推出的跨平台开发框架&#xff0c;支持从一个代码库生成 iOS、Android、Web 和桌面应用&#xff1b;React 则是 Facebo…...

基于Docker的Spark分布式集群

目录 1. 说明 2. 服务器规划 3. 步骤 3.1 要点 3.2 配置文件 3.2 访问Spark Master 4. 使用测试 5. 参考 1. 说明 以docker容器方式实现apache spark计算集群&#xff0c;能灵活的增减配置与worker数目。 2. 服务器规划 服务器 (1master, 3workers) ip开放端口备注ce…...

Web 代理、爬行器和爬虫

目录 Web 在线网页代理服务器的使用方法Web 在线网页代理服务器使用流程详解注意事项 Web 请求和响应中的代理方式Web 开发中的请求方法借助代理进行文件下载的示例 Web 服务器请求代理方式代理、网关和隧道的概念参考文献说明 爬虫的工作原理及案例网络爬虫概述爬虫工作原理 W…...

MySQL 事件调度器

MySQL 事件调度器确实是一个更方便且内置的解决方案&#xff0c;可以在 MySQL 服务器端自动定期执行表优化操作&#xff0c;无需依赖外部工具或应用程序代码。这种方式也能减少数据库维护的复杂性&#xff0c;尤其适用于在数据库频繁更新或删除时进行自动化优化。 使用 MySQL …...

直线拟合例子 ,岭回归拟合直线

目录 直线拟合,算出离群点 岭回归拟合直线&#xff1a; 直线拟合,算出离群点 import cv2 import numpy as np# 输入的点 points np.array([[51, 149],[122, 374],[225, 376],[340, 382],[463, 391],[535, 298],[596, 400],[689, 406],[821, 407] ], dtypenp.float32)# 使用…...

Flutter android debug 编译报错问题。插件编译报错

下面相关内容 都以 Mac 电脑为例子。 一、问题 起因&#xff1a;&#xff08;更新 Android studio 2024.2.2.13、 Flutter SDK 3.27.2&#xff09; 最近 2025年 1 月 左右&#xff0c;我更新了 Android studio 和 Flutter SDK 再运行就会出现下面的问题。当然 下面的提示只是其…...

关于IPD流程的学习理解和使用

IPD&#xff08;Integrated Product Development&#xff0c;集成产品开发&#xff09;是一种系统化的产品开发流程和方法论&#xff0c;旨在通过跨职能团队的协作和并行工程&#xff0c;缩短产品开发周期&#xff0c;提高产品质量&#xff0c;降低开发成本。IPD 最初由美国 PR…...

C# 类(Class)

C# 类&#xff08;Class&#xff09; 概述 在C#编程语言中&#xff0c;类&#xff08;Class&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念之一。类是一种用户定义的数据类型&#xff0c;它包含了一组属性&#xff08;数据&#xff09;和方法&#xff08;…...

Jenkins pipline怎么设置定时跑脚本

目录 示例&#xff1a;在Jenkins Pipeline中设置定时触发 使用pipeline指令设置定时触发 使用Declarative Pipeline设置定时触发 使用Scripted Pipeline设置定时触发 解释Cron表达式 保存和应用配置 小结 在Jenkins中&#xff0c;定时跑脚本&#xff08;例如定时执行Pip…...

PostgreSQL模糊查询相关学习参考

PostgreSQL大数据量快速模糊检索实践_postgresql 模糊查询-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞20次&#xff0c;收藏25次。注意&#xff1a; 本文内容于 2024-08-18 23:50:33 创建&#xff0c;可能不会在此平台上进行更新。。_postgresql 模糊查询https://blog.csdn.n…...