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

文章目录

  • 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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据-190 Elasticsearch - ELK 日志分析实战 - 配置启动 Filebeat Logstash

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

uniapp:上拉加载更多、下拉刷新、页面滚动到指定位置

提醒 本文实例是使用uniapp进行开发演示的。 一、需求场景 在开发商品&#xff08;SKU&#xff09;列表页面时&#xff0c;通常有三个需求&#xff1a; 页面下拉刷新&#xff0c;第一页展示最新数据&#xff1b;上拉加载更多数据&#xff1b;列表页面可以滚动到指定位置&#x…

如何为工业未来赋能?通过CodeMeter为工业企业开辟工业自动化安全与灵活性之道

在现代工业自动化领域&#xff0c;数字化转型已经成为不可逆的趋势。然而&#xff0c;要将新一代的自动化软件与传统设备集成&#xff0c;企业面临的不仅是技术上的复杂性&#xff0c;更是如何有效保护宝贵的知识产权并实现灵活管理的严峻挑战。菲尼克斯电气&#xff08;Phoeni…

HTML5教程(一)- 网页与开发工具

1. 什么是网页 网页 基于浏览器阅读的应用程序&#xff0c;是数据&#xff08;文本、图像、视频、声音、链接等&#xff09;展示的载体常见的是以 .html 或 .htm 结尾的文件 网站 使用 HTML 等制作的用于展示特定内容相关的网页集合。 2. 网页的组成 浏览器 代替用户向服务…

【云原生】Kubernets1.29部署StorageClass-NFS作为存储类,动态创建pvc(已存在NFS服务端)

文章目录 在写redis集群搭建的时候,有提到过使用nfs做storageclass,那时候kubernetes是1.20版本,https://dongweizhen.blog.csdn.net/article/details/130651727 现在使用的是kubernetes 1.29版本,根据之前的修改方式并未生效,反而提示:Error: invalid argument "Re…

C语言 动态数据结构的C语言实现单向链表-2

建立一个单向链表 在单向链表中查找节点---查找尾节点 在单向链表中查找节点 --- 查找第 n 个节点 向单向链表中插入一个节点 向单向链表的尾部插入一个节点 向单向链表中某节点后插入一个节点 向单向链表中插入一个节点 删除单向链表中的某一节点 链表 vs 数组 动态数据结构

C++核心编程和桌面应用开发 第十五天(deque/stack/queue)

目录 1.deque容器 1.1构造和赋值&#xff08;同vector类似&#xff09; 1.2大小操作 1.3插入和删除 1.5数据存取 1.6排序&#xff08;升序&#xff09; 2.stack容器 3.queue容器 1.deque容器 1.1构造和赋值&#xff08;同vector类似&#xff09; deque内部工作原理&a…

湖北省自闭症全托管:为您推荐湖北省的自闭症服务机构

原文指路&#xff1a;http://www.zibizhengwang.com/page35.html 自闭症&#xff0c;这一复杂而神秘的神经发育障碍&#xff0c;长久以来困扰着无数家庭。它不仅影响着儿童的社交互动、沟通能力&#xff0c;还常常伴随着行为问题和感官过敏。面对这一挑战&#xff0c;湖北省内…

HTML静态网页作业成品(HTML+CSS)——动漫犬夜叉主题网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码1、HTML代码2、CSS部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用DIVCSS布局&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二…

使用Python来下一场深夜雪

效果图&#xff1a;&#xff08;真实情况是动态的&#xff09; 完整代码&#xff1a; import turtle import random# 初始化画布 turtle.bgcolor("#001f3f") # 偏深蓝色的背景 turtle.title("下雪的画面") turtle.speed(0) turtle.hideturtle() turtle.t…

ffmpeg视频滤镜:定向模糊-dblur

滤镜简述 dblur 官网链接 > https://ffmpeg.org/ffmpeg-filters.html#dblur 有一个模糊滤镜&#xff0c;我试了一下&#xff0c;没有感觉到它的特殊之处, 这里简单介绍一下。 滤镜使用 滤镜的参数 angle <float> ..FV.....T. set angle (from 0 t…

基于neo4j的旅游知识图谱维护与问答系统

你还在为毕业设计发愁吗&#xff1f;试试这个基于Neo4j的旅游知识图谱维护与问答系统吧&#xff01;这套系统不仅功能强大&#xff0c;而且几乎涵盖了你需要的一切&#xff0c;完美助力你的毕业项目&#xff01; 系统介绍 该系统是专门针对旅游景点信息的知识图谱工具&#x…

ClickHouse在百度MEG数据中台的落地和优化

导读 百度MEG上一代大数据产品存在平台分散、质量不均和易用性差等问题&#xff0c;导致开发效率低下、学习成本高&#xff0c;业务需求响应迟缓。为了解决这些问题&#xff0c;百度MEG内部开发了图灵3.0生态系统&#xff0c;包括Turing Data Engine(TDE)计算引擎、Turing Dat…

常用排序算法总结

内容目录 1. 选择类排序 1.1 直接选择排序1.2 堆排序 2. 交换类排序 2.1 冒泡排序2.2 快速排序 3. 插入类排序 3.1 直接插入排序3.2 希尔排序 4. 其它排序 4.1 归并排序4.2 基数排序/桶排序 排序 1. 选择类排序 选择类排序的特征是每次从待排序集合中选择出一个最大值或者最…

大数据治理平台建设规划方案(71页WORD)

随着信息化时代的到来&#xff0c;大数据已成为企业管理和决策的重要基础。然而&#xff0c;大数据的快速增长和复杂性给数据的管理和治理带来了巨大挑战。为了有效应对这些挑战&#xff0c;构建一个高效、稳定的大数据治理平台显得尤为重要。 文档介绍&#xff1a; 该平台旨在…

零基础Java第十期:类和对象(一)

目录 一、拜访对象村 1.1. 什么是面向对象 1.2. 面向对象与面向过程 二、类定义和使用 2.1. 类的定义格式 2.2. 类的定义练习 三、类的实例化 3.1. 什么是实例化 3.2. 类和对象的说明 四、this引用 4.1. 什么是this引用 4.2. this引用的特性 一、拜访对象村 在…

基于SSM考研助手系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教学秘书管理&#xff0c;考研资讯管理&#xff0c;考研名师管理&#xff0c;考研信息管理&#xff0c;系统管理 教学秘书账号功能包括&#xff1a;系统首页&#xff0c;个人中心…

让你的 IDEA 使用更流畅 | IDEA内存修改

随着idea使用越来越频繁&#xff0c;笔者最近发现使用过程中有时候会出现卡顿现象&#xff0c;例如&#xff0c;启动软件变慢&#xff0c;打开项目的速度变慢等&#xff1a; 因此如果各位朋友觉得最近也遇到了同样的困惑&#xff0c;不妨跟着笔者一起来设置IDEA的内存大小吧~ …

基于Bert+Attention+LSTM智能校园知识图谱问答推荐系统

获取更多完整项目代码数据集&#xff0c;点此加入免费社区群 &#xff1a; 首页-置顶必看 1. 项目简介 本项目旨在实现基于ALBERT模型的命名实体识别&#xff08;NER&#xff09;任务。ALBERT&#xff08;A Lite BERT&#xff09;是谷歌提出的轻量级BERT模型&#xff0c;具有…

贪心算法与盛雨水问题

啥是盛雨水问题&#xff1f;给个图就熟悉了 欸&#xff1f; 这其中的关键在于&#xff1a; 1. 容量2D化就是长 * 宽 2. 木桶效应&#xff1a;宽取决于短板。 那我们来分析&#xff0c;怎么样能达到最佳的结果呢&#xff1f;穷举一下所有可能性不就好了&#xff1f;每两个板子…