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

爬虫基础之爬取某站视频

目标网址:为了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 requests

url = '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 subprocess


url = '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)

本次的案例分析就到此结束啦 感谢大家的观看 您的点赞和关注是我更新的动力


http://www.kler.cn/a/514666.html

相关文章:

  • linux网络 | 传输层TCP | 认识tcp报头字段与分离
  • C++17 新特性深入解析:constexpr 扩展、if constexpr 和 constexpr lambda
  • QT:QTabWidget设置tabPosition为West时,文字向上
  • 如何通过海外社交媒体平台提升品牌曝光度?
  • 电梯系统的UML文档07
  • 使用 Box2D 库开发愤怒的小鸟游戏
  • VIVO大数据面试题及参考答案
  • PID 控制算法(二):C 语言实现与应用
  • KT148A语音芯片一个mp3语音,有办法分成一段一段的吗
  • typescript 书写.d.ts文件
  • 【ubuntu 连接显示器无法显示】可以通过 ssh 连接 ubuntu 服务器正常使用,但服务器连接显示器没有输出
  • AI新玩法:Flux.1图像生成结合内网穿透远程生图的解决方案
  • win暂停更新设置
  • react上增加错误边界 当存在错误时 不会显示白屏
  • Spring 中 Bean 是什么?从类到 Bean 的核心概念解析
  • SpringBoot对于Spring的扩展
  • 图论 n 皇后问题
  • Hadoop特点和HDFS命令
  • IP地址的格式有哪几类类型
  • vim在末行模式下的删除功能
  • MyBatis和JPA区别详解
  • YOLO-cls训练及踩坑记录
  • LightGBM:让机器学习更快、更准、更高效
  • 基于SpringBoot+Vue的旅游管理系统【源码+文档+部署讲解】
  • gitlab处理空文件夹的提交或空文件夹提交失败
  • 洛谷题目 P1271 【深基9.例1】选举学生会 题解