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

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

时间:2024-10-27 22:46:11浏览次数:7  
标签:视频 title python 音频 抓取 音视频 url video data

文章目录

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)

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

标签:视频,title,python,音频,抓取,音视频,url,video,data
From: https://blog.csdn.net/m0_59470317/article/details/143143867

相关文章

  • python数学建模习题六
    学号后四位3026,1班6.1importnetworkxasnximportmatplotlib.pyplotaspltL1=[(1,2),(1,3),(1,4),(2,3),(2,6),(3,4),(4,5),(5,6)]G1=nx.Graph();G1.add_nodes_from(range(1,7))G1.add_edges_from(L1);posl=nx.shell_layout(G1)plt.subplot(131......
  • Python 函数的返回值定义语法
    什么是函数返回值?函数在执行完成后,返回给调用者的结果返回值的应用语法:使用关键字:return来返回结果def函数(参数...):函数体return返回值变量=函数(参数)注意:函数体在遇到return后就结束了,所以写在return后的代码不会执行练习:#定义一个函数,完成两......
  • python可以对excel进行那些操作
    根据标题“Python可以对Excel进行哪些操作”,Python对Excel的操作能力强大,涵盖数据读写、格式设置、图表创建、数据分析和自动化处理等功能。例如,1、读取和写入数据:Python可以读取Excel文件中的数据,并将数据写入到Excel中;2、格式设置:Python能够调整字体、颜色、单元格的大小和排列;3......
  • 中值滤波python代码
    文章目录一、中值滤波二、代码实现一、中值滤波中值滤波使用了局部邻域(窗口)里的中值来代替上述局部平均法中的局部平均值。即将以该点为中心的某个窗口框住的各像素的中间值作为处理后图象中该点像素的值。能有效处理椒盐噪声。二、代码实现下图代码实现了中值滤波对......
  • 100种算法【Python版】第14篇——Pollard‘s Rho 质因数分解算法
    本文目录1基本原理2算法步骤3数学示例4python代码1基本原理Pollard’sRho算法是由约翰·波拉德(JohnPollard)于1975年提出的一种用于整数因数分解的概率算法。它以高效性和实现简洁著称。核心原理伪随机序列生成:利用一个简单的迭代函数生成一个伪随机......
  • python系列【亲测有效-只到了图形化连接桌面】:Python 调用windows系统远程桌面应用
    Python调用windows系统远程桌面应用Python调用windows系统远程桌面应用使用pyautogui模块实现远程桌面应用的调用总结参考链接Python调用windows系统远程桌面应用远程桌面应用是一种方便用户在远程设备上访问和控制本地桌面的技术,对于远程办公、远程......
  • 机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
    1.基础算法常见面试篇1.1过拟合和欠拟合常见面试篇一、过拟合和欠拟合是什么?二、过拟合/高方差(overfiting/highvariance)篇2.1过拟合是什么及检验方法?2.2导致过拟合的原因是什么?2.3过拟合的解决方法是什么?三、欠拟合/高偏差(underfiting/highbias)篇3.......
  • 【MySQL】实战篇—应用开发:使用MySQL与编程语言(如Python、Java、PHP等)进行交互
    MySQL是存储和管理数据的强大工具,而编程语言(如Python、Java、PHP等)则用于开发应用程序和处理业务逻辑。将这两者结合起来,可以实现数据的存储、查询、更新和管理,进而构建功能强大的应用程序。2.重要性和实际应用场景在软件开发中,数据库与编程语言的交互至关重要,以下是一些常......
  • Python酷库之旅-第三方库Pandas(161)
    目录一、用法精讲736、pandas.Period.freq属性736-1、语法736-2、参数736-3、功能736-4、返回值736-5、说明736-6、用法736-6-1、数据准备736-6-2、代码示例736-6-3、结果输出737、pandas.Period.freqstr属性737-1、语法737-2、参数737-3、功能737-4、返回值7......
  • Python基础入门——Python数据结构
    前言1.List(列表)原理列表是一种有序的可变容器,可以存储任意类型的对象。它的主要操作包括索引、切片、添加、删除、修改元素等。列表中的元素在内存中是连续存储的(对于简单的对象,如整数、字符串等是这样,对于复杂对象可能涉及到引用的存储),这使得通过索引访问元素的速度非......