python爬虫实战案例——抓取B站视频,不同清晰度抓取,实现音视频合并,超详细!(内含完整代码)

news2024/11/30 14:45:27

文章目录

  • 1、任务目标
  • 2、网页分析
  • 3、代码编写

1、任务目标

目标网站:B站视频(https://www.bilibili.com/video/BV1se41117WP/?vd_source=e8e376ccbc5aa4cfd88e6a7917adfd1a),用于本文测验
要求:抓取该网址下的视频,将其存入本地,如下:

在这里插入图片描述

2、网页分析

在分析网页前,我们需要明白爬取的数据是什么,因为b站的视频跟音频是分开存放的,所以我们需要分别找到视频和音频的url,然后在对其发起请求将视频和音频保存至本地;最后将两者合并在一起,才能形成完整的视频文件

  1. 打开目标网站,大家可以先登录B站,这样才能下载高清视频,打开浏览器开发者模式,刷新网页,寻找数据接口
    在这里插入图片描述
  2. 经过分析,在Network-Doc下发现了一个文件,该文件源码中就存放了视频和音频的url地址,所以我们需要向该文件接口发起请求,将视频和音频的url地址解析出来

在这里插入图片描述

  1. 得到该数据接口的请求url和请求参数
    在这里插入图片描述

  2. 找到所需的数据接口后,我们可以先分析一下网页源码,我们发现视频url存放在一个 <script>标签下的 video
    在这里插入图片描述

  3. 我们需要获取的是 video下的 baseurl,但我们会发现这种url在video下有许多,他们其实代表着不同清晰度和不同编码,这里我教大家如何区分,首先id相同的表示是同一个清晰度的视频url,codes 代表着不同的编码格式;大家可以根据第3步图中信息判断清晰度,id=80就代表 高清1080p,因为我没有会员,这里最高只显示高清1080p的baseurl,所以我们就抓取它即可
    在这里插入图片描述

  4. 音频的url同样也在<script>标签下,我们向下翻,发现音频url在 audio 下的 baseUrl中,且下面有3种类型的baseurl,我们同样根据id来选择,视频url为高清1080p,所以音频就选择id=30280baseurl
    在这里插入图片描述

3、代码编写

编写代码前,需要大家安装一个第三方工具ffmpeg,用于合并视频和音频
安装教程:https://blog.csdn.net/qq_45956730/article/details/125272407


完整代码:

'''
目标站点:https://www.bilibili.com/video/BV1se41117WP/?vd_source=e8e376ccbc5aa4cfd88e6a7917adfd1a B站
任务:抓取网址下的视频,将其存入本地
'''

# 导入模块
import requests
import re
import json
from jsonpath import jsonpath
from bs4 import BeautifulSoup
import os

# 1、站点信息

# 目标网站
url = 'https://www.bilibili.com/video/BV1se41117WP/'

# 身份信息,若cookie值失效,刷新网页更换即可
header = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Referer":"https://www.bilibili.com/",
    "Cookie":"i-wanna-go-back=-1; buvid4=3347E997-02D2-04C8-A7BF-156C62FCF90B88409-022070218-vps4PunhlmjD%2FldTeJtIPg%3D%3D; buvid_fp_plain=undefined; DedeUserID=131564301; DedeUserID__ckMd5=cd1905451e79f724; CURRENT_BLACKGAP=0; buvid3=256ABE92-A581-24BC-8E24-6FF290D67AAD49841infoc; b_nut=1698501949; b_ut=7; _uuid=E716FD102-B224-3AF5-BF13-7FFF9888B73450357infoc; rpdid=|(um)~|)kk)k0J'uYm)l|um~u; PVID=1; header_theme_version=CLOSE; enable_web_push=DISABLE; fingerprint=561ef2aee0e68972fc241f5969acd97b; hit-dyn-v2=1; FEED_LIVE_VERSION=V_WATCHLATER_PIP_WINDOW3; CURRENT_FNVAL=4048; buvid_fp=561ef2aee0e68972fc241f5969acd97b; SESSDATA=33cf5dfb%2C1744988952%2Cb57ab%2Aa1CjBKimVs0wevrn9Ta4wYyhdBx-INz-37PGOJXhzOdeCNbnP3by5al9qZYhWgDs8BqO0SVk5MQzdsRzNWbWNaTHhWX3E1d1RKbl9WS3BGWjVudnpjd0d6NnV0ZWxYSU9FREktWlY0d2pMaU1LU1JVSUNZWFFtdDk1OEMyWFNickFCOFlncy1RYXR3IIEC; bili_jct=f6fe7d7a9e53628a226c3b5635076cbf; bp_t_offset_131564301=990413587237306368; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjk2OTY0MzcsImlhdCI6MTcyOTQzNzE3NywicGx0IjotMX0.6xy7DMJZDMBJycpOYWnXejp5ihkcRy4mE85OBVgjUFU; bili_ticket_expires=1729696377; bmg_af_switch=1; bmg_src_def_domain=i0.hdslb.com; sid=6az7b526; CURRENT_QUALITY=64; home_feed_column=4; browser_resolution=1279-700; b_lsid=61131031F_192AE3E6666",
}

# 请求参数、
param = {
    "vd_source":"e8e376ccbc5aa4cfd88e6a7917adfd1a",
}

# 2、请求网站
def get():
    response = requests.get(url,headers=header,params=param) # 发起请求
    if response.status_code == 200:
        html_data = response.text # 返回网页源码
        data = re.findall('<script>window.__playinfo__=(.*?)</script>',html_data,re.S)[0] # 用正则将网页中script标签内的数据匹配出来
        json_data = json.loads(data) # 将匹配的数据转换为json格式,字典
        return html_data,json_data

# 3、解析数据
def parse(html_data,json_data):
    soup = BeautifulSoup(html_data,'lxml') # 生成解析对象
    title = soup.select('div.title-txt')[0].string # 获取视频标题,有多种方法,大家自行选择
    # print(title)
    video_url = jsonpath(json_data,'$..data.dash.video..baseUrl')[0] # 获取视频链接
    # print(video_url)
    audio_url = jsonpath(json_data,'$..data.dash.audio..baseUrl')[0] # 获取音频链接
    # print(audio_url)
    return title,video_url,audio_url

# 4、将视频存放至本地
def save(title,video_url,audio_url,path):
    print('视频和音频开始下载')
    video = requests.get(video_url,headers=header).content # 下载视频
    audio = requests.get(audio_url,headers=header).content # 下载音频
    # 保存视频
    with open(f'{path}{title}.mp4','wb') as f1: # 将视频保存至指定路径下
        f1.write(video)
    print('视频下载完成')

    # 保存音频
    with open(f'{path}{title}.mp3','wb') as f2: # 将音频保存至指定路径下
        f2.write(audio)
    print('音频下载完成')

# 5、合并视频和音频
def craft(path,title):
    # 使用第三方工具ffmpeg,合成视频和音频的命令,参考:https://blog.csdn.net/bangongzhushou/article/details/140019824
    cmd = fr"ffmpeg -i {path}{title}.mp4 -i {path}{title}.mp3 -c:v copy -c:a aac -strict experimental -map 0:v -map 1:a {path}csdn\{title}.mp4 -loglevel quiet" # -loglevel quiet 表示隐藏日志,不加问题不大
    os.system(cmd) # 调用windows命令
    print('视频和音频合并完成') # 合并后会生成新的.MP4文件
    os.remove(f'{path}{title}.mp4') # 删除原有的视频文件
    os.remove(f'{path}{title}.mp3') # 删除原有的音频文件
    print(f'已删除原有的视频和音频文件')
    print('---'*10)

# 6、启动函数
def start(path):
    # 依次调用定义的函数,完成视频抓取
    html_data, json_data = get()
    title, video_url, audio_url = parse(html_data, json_data)
    save(title, video_url, audio_url, path)
    craft(path, title)

if __name__ == '__main__':
    path = 'F:/videoDownload/' # 视频存放的路径,大家自定义
    start(path)

执行效果:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[四轴飞行器] 方向控制原理

四轴飞行器的基本工作原理 四轴飞行器基本原理是通过飞控控制四个电机旋转带动桨叶产生升力,分别控制每一个电机和桨叶产生不同升力从而控制飞行器的姿态和位置 四轴在空中可实现八种运动,分别是垂直上升,垂直下降,向前运动,向后运动,向左运动,向右运动,顺时针改变航向,逆时针…

量化交易打怪升级全攻略

上钟&#xff01; 继续分享量化干货~ 这次要唠的是Stat Arb的新作《Quant Roadmap》(中译名《量化交易路线图》)&#xff0c;为了方便&#xff0c;下文就称呼作者为“老S”&#xff0c;根据公开资料显示&#xff0c;他可是正儿八经的的量化研究员出身&#xff0c;在漂亮国头部对…

视觉化医学数据:使用气泡图揭示患者健康指标的关系

在医学领域&#xff0c;数据的可视化至关重要。它不仅帮助研究人员和医生理解复杂的关系&#xff0c;还能为临床决策提供有力支持。在众多可视化工具中&#xff0c;气泡图因其直观性和多维性而广受欢迎。本文将通过一个具体例子&#xff0c;展示如何使用气泡图来分析患者的体重…

钡铼技术R40工业无线路由支持边缘计算断网补传

随着工业互联网和智能制造的迅速发展&#xff0c;工业设备之间的互联互通变得愈加重要。在这个背景下&#xff0c;钡铼技术推出的R40工业无线路由器&#xff0c;凭借其先进的边缘计算能力和断网补传功能&#xff0c;为工业应用提供了强大的支持。 一、边缘计算的意义 边缘计算…

js实现简单计算机/验证密码是否合法

1.怎么实现一个计算机可以进行简单的加减乘除呢? 就像下面这样可以计算112... 在js中可以直接获取id的输入文本框对应的值 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" c…

基于SSM+微信小程序考试的管理系统(考试1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序考试的管理系统实现了管理员及用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;考试资料管理&#xff0c;用户交流管理&#xff0c;试卷管理&#xff…

一行代码,实现请假审批流程(Java版)

首先画一个流程图 测试流程图 activiti 项目基础配置 activiti 工作流引擎数据库设计 工作流引擎API 介绍 什么是BPMN流程图 工作流引擎同类对比 继续学习方向 总结 工作流审批功能是办公OA系统核心能力&#xff0c;如果让你设计一个工作流审批系统&#xff0c;你会吗…

C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询

本文&#xff0c;分享 MyBatis 各种常用操作&#xff0c;不限于链表查询、分页查询等等。 1. 分页查询 在 下文的 的「3.4 selectPage」小节&#xff0c;我们使用 MyBatis Plus 实现了分页查询。除了这种方式&#xff0c;我们也可以使用 XML 实现分页查询。 这里&#xff0c…

c语言中自定义类型:结构体的声明和自引用

结构体回顾 结构是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量 例如&#xff1a; #include<stdio.h> struct Book {char book_name[20];char author[20];float price;char id[9]; }b4,b5,b6;//结构体变量 int main()…

JAVA基础:集合 (习题笔记)

写完一定记得 CtrlAltL 让代码格式标准 1.使用List和Map存放多个图书信息&#xff0c;遍历并输出。其中商品属性&#xff1a;编号&#xff0c;名称&#xff0c;单价&#xff0c;出版社&#xff1b;使用商品编号作为Map中的key。 Books类 package set.saturdayPlan;public class…

经纬恒润AUTOSAR成功适配芯钛科技Alioth TTA8车规级芯片

在汽车电子领域&#xff0c;功能安全扮演着守护者的角色&#xff0c;它确保了车辆在复杂多变的情况下保持稳定可靠的运行。随着汽车电子的复杂性增加&#xff0c;市场对产品功能安全的要求也日益提高。基于此背景&#xff0c;经纬恒润AUTOSAR基础软件产品INTEWORK-EAS-CP成功适…

STL-常用容器-list

1list基本概念 **功能&#xff1a;**将数据进行链式存储 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成&#xff1a;链表由一系列结点组成 结点的组成&#xff1a;一个是存储…

如何将 PDF 转换成JPG图片?这里有4个详细指南

通常情况下&#xff0c;图片文件比 PDF 文件加载速度更快&#xff0c;所以如果将PDF转换成图片的格式&#xff0c;或更容易分享以及浏览。所以&#xff0c;今天就教大家4个方法&#xff0c;帮助大家快速的进行PDF和JPG图片之间的转换。 1、PDF转换大师 直通车&#xff1a;www.…

深度学习超参数调优指南

文章目录 深度学习超参数调优指南一、超参数相关基础知识1. 神经网络中包含哪些超参数2. 超参数的重要性顺序3. 部分超参数如何影响模型性能4. 部分超参数合适的范围 二、超参数调整技巧1. 如何选择激活函数2. 如何调整 Batch Size3. 如何调整学习率 三、自动调参方法1. 网格搜…

【JIT/极态云】技术文档--函数设计

一、简介 函数是计算机编程中非常重要的概念。它是一段代码&#xff0c;可以在程序中多次调用&#xff0c;用于完成特定的任务。 函数通常接受输入参数&#xff0c;执行特定的操作&#xff0c;并返回一个结果。这个结果可以被程序中的其他代码使用。 二、新建函数 在函数列表…

Ubuntu下Mysql修改默认存储路径

首先声明&#xff0c;亲身经验&#xff0c;自己实践&#xff0c;网上百度了好几个帖子&#xff0c;全是坑&#xff0c;都TMD的不行&#xff0c;修改各种配置文件&#xff0c;就是服务起不来&#xff0c;有以下几种配置文件需要修改 第一个文件/etc/mysql/my.cnf 这个文件是存…

【论文阅读】FUNNELRAG:一个从粗到精的逐级检索范式

论文地址&#xff1a;https://arxiv.org/abs/2410.10293 github&#xff1a; 研究背景 现有的检索范式存在两个主要问题&#xff1a;一是平铺检索(flat retrieval)对单个检索器造成巨大负担&#xff1b;二是恒定粒度(constant granularity)限制了检索性能的上限。研究难点在于…

map 和 set 的使用

文章目录 一.序列式容器和关联式容器二. set 系列的使用1. set 和 multiset 参考文档2. set 类介绍3. set 的构造和迭代器4. set 的增删查5. insert 和迭代器遍历使用样例6. find 和 erase 使用样例7. multiset 和 set 的差异 三. map 系列的使用1. map 和 multimap参考文档2. …

11张思维导图带你快速学习java

简介 Java是一种跨平台的编程语言&#xff0c;广泛应用于开发各种类型的应用程序。从零开始学习Java可能会感到困惑&#xff0c;因为Java拥有广泛的功能和概念。为了更好地学习和理解Java&#xff0c;可以使用思维导图来整理和归纳Java的主要概念和特点。思维导图可以帮助学习…

iOS 18.2开发者预览版 Beta 1版本发布,欧盟允许卸载应用商店

苹果今天为开发人员推送了iOS 18.2开发者预览版 Beta 1版本 更新&#xff08;内部版本号&#xff1a;22C5109p&#xff09;&#xff0c;本次更新距离上次发布 Beta / RC 间隔 2 天。该版本仅适用于支持Apple Intelligence的设备&#xff0c;包括iPhone 15 Pro系列和iPhone 16系…