Python爬虫:爬取B站视频(最新、能用且讲解详细)【01】

📚博客主页:knighthood2001
公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)
🎃知识星球:【认知up吧|成长|副业】介绍
❤️如遇文章付费,可先看看我公众号中是否发布免费文章❤️
🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!

今天,我们来实现一下,B站视频的爬取。(本文仅供学习讨论)

首先要知道,B站视频清晰度和登录是息息相关的。

手动一下

你打开一个视频。
在这里插入图片描述

https://www.bilibili.com/video/BV1jt421c7yN/?vd_source=2ab95dfa6677af399778850be1824b83

学过爬虫的应该会知道,有些参数是可以不需要的。下面这个网址也能成功打开这个视频。

https://www.bilibili.com/video/BV1jt421c7yN/


接着,打开开发者工具(快捷键F12),点击网络(network)
在这里插入图片描述

然后将网页刷新一下。

在这里插入图片描述
上面这个文件看着比较特殊,打开看看。

可以发现,这个发送请求的url就是我们这个视频网址

在这里插入图片描述

同样,下面这个网址也能获得相应内容。

在这里插入图片描述

然后我们看看响应,发现里面有个video和audio,对应视频和音频。

此外,这个视频还有对应的高和宽
在这里插入图片描述
在这里插入图片描述

因此可以得出,我们获取到这几个网址(直接打开会提示403,因此需要假如一些参数进行爬取),就能把内容读取出来,然后保存到本地即可。

此外,也可以得出,b站视频和音频是分开的,你爬取后,需要进行合并处理。

题外话

经过以上分析,可以发现,视频网址中有我们需要的内容,但是我最开始,找了一圈,没找到。

后来发现,这内容藏在网页的head中。

包括网址,视频题目等等信息。

在这里插入图片描述
其中的视频、音频都藏在这里面。

在这里插入图片描述

此外,你可以发现,下面这两个文件,好像就是我上面返回内容中的网址。只是不知道哪个对应的是视频、哪个对应的是音频。
在这里插入图片描述
当然,你可以在返回信息中,工具m4s前面的几个数字进行查找,看其对应的是video视频还是audio音频

不过,据我观察,m4s前面有6位数字的,就是视频,前面是5位数字的,就是音频。


最笨的爬虫

有了以上的内容,其实你最基本的爬虫,就能写了。

首先就是,查看一下,网址和请求头需要的参数。
在这里插入图片描述
在这里插入图片描述
可以看到,User-AgentReferer是必须要的。此外,这个Referer的内容就是我们刚开始的网址。

Referer就是防盗链,用来告诉服务器你请求链接是从哪里跳转过来的,没有这个,就无法成功。(即使下载好后,打开文件,会显示无法播放)

在这里插入图片描述

因此,代码就能写了

# TODO 视频网址
url = 'https://www.bilibili.com/video/BV1jt421c7yN/'
headers = {
        # Referer 防盗链 告诉服务器你请求链接是从哪里跳转过来的
        # "Referer": "https://www.bilibili.com/video/BV1454y187Er/",
        "Referer": url,
        # User-Agent 用户代理, 表示浏览器/设备基本身份信息
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
    }
import requests
# TODO 通过F12查看视频的地址
video_url = 'https://xy183x214x144x8xy2409y8c50yda00y126yy8xy.mcdn.bilivideo.cn:4483/upgcxcode/83/23/1523062383/1523062383-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715968562&gen=playurlv2&os=mcdn&oi=1879749745&trid=00008c163333de3442dc929f4f62aff31adau&mid=691902317&platform=pc&upsig=a453aaa2553b8cd8f2fcca789fcd68d2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=50002512&bvc=vod&nettype=0&orderid=0,3&buvid=2844B77E-F527-FB05-1DF5-9FDF834AE3E888277infoc&build=0&f=u_0_0&agrr=0&bw=25270&logo=A0020000'

video_response = requests.get(video_url, headers=headers)
with open('shiping.mp4', mode='wb') as v:
    v.write(video_response.content)
    
# TODO 通过F12查看音频的地址
audio_url = 'https://xy183x214x144x8xy2409y8c50yda00y126yy8xy.mcdn.bilivideo.cn:4483/upgcxcode/83/23/1523062383/1523062383-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715968562&gen=playurlv2&os=mcdn&oi=1879749745&trid=00008c163333de3442dc929f4f62aff31adau&mid=691902317&platform=pc&upsig=a9e345e9808698097e942b690872ece1&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=50002512&bvc=vod&nettype=0&orderid=0,3&buvid=2844B77E-F527-FB05-1DF5-9FDF834AE3E888277infoc&build=0&f=u_0_0&agrr=0&bw=9931&logo=A0020000'
audio_response = requests.get(audio_url, headers=headers)
with open('yingping.mp3', mode='wb') as v:
    v.write(audio_response.content)

首先,你需要一个B站视频网址,然后你可以通过开发者工具,看到视频和音频的url,通过requests去获取二进制数据,然后保存到本地即可。

弊端:你需要复制视频、音频对应的url。

改进

以上代码,其实只是告诉你,有了视频、音频对应的url,如何去下载,因为直接打开对应的url,是提示403的。因此需要添加一些请求头(这里不需要Cookie)。

一般写爬虫,是只告诉一个视频网址,然后就进行爬取。接下来让我们实现这个。


由于我最开始说过,B站视频清晰度和登录有关,登录就涉及到Cookie,因此你需要复制你的Cookie。

在这里插入图片描述
然后构造一下请求头

headers = {
        # Referer 防盗链 告诉服务器你请求链接是从哪里跳转过来的
        # "Referer": "https://www.bilibili.com/video/BV1454y187Er/",
        "Referer": url,
        # User-Agent 用户代理, 表示浏览器/设备基本身份信息
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Cookie": cookie
}

尽管https://www.bilibili.com/video/BV1jt421c7yN/网站中不需要Referer参数,但是这个参数在后面下载视频和音频的时候是需要的,并且现在加上,使用requests去访问,不会出现问题,因此我就加上这个Referer了,否则可能就得构造两个请求头,一个没有Referer,一个有Referer

然后你就可以去打印网页源代码,通过正则表达式获取视频标题。

# 发送请求
response = requests.get(url=url, headers=headers)
html = response.text
print(html)
# 解析数据: 提取视频标题
title = re.findall('title="(.*?)"', html)[0]
print(title)

此外,我们需要的视频和音频网址,都在window.__playinfo__=中。我们同样可以通过正则获取到这块内容。

这块内容,刚好还可以转换成字典格式,方便你通过键值对机制,获取到指定的url。

代码如下:

# 提取视频信息
info = re.findall('window.__playinfo__=(.*?)</script>', html)[0]
# info -> json字符串转成json字典
json_data = json.loads(info)
pprint(json_data)
# 提取视频链接
video_url = json_data['data']['dash']['video'][0]['baseUrl']
print(video_url)
# 提取音频链接
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
print(audio_url)

最后就是和最笨的爬虫一样,爬取视频音频内容,保存下来。


全部代码如下:

# 导入数据请求模块
import requests
# 导入正则表达式模块
import re
# 导入json模块
import json
# TODO 记得更改你要的url和你自己的cookie
url = 'https://www.bilibili.com/video/BV1jt421c7yN/'
cookie = "buvid3=2844B77E-F527-FB05-1DF5-9FDF834AE3E888277infoc; b_nut=1709986388; i-wanna-go-back=-1; b_ut=7; _uuid=6577D687-BED9-9AE2-106A10-551210627F5AC88087infoc; enable_web_push=DISABLE; buvid4=5ED5B3A0-A998-7D47-3815-9AD9A1B27A4989131-024030912-0Fw3r6dKwZLwPoWOl%2F8HuA%3D%3D; CURRENT_FNVAL=4048; rpdid=|(u|Jmkkuukk0J'u~u|ulR~)~; header_theme_version=CLOSE; fingerprint=c27c0b59dd10dcdc4c14701a58f49669; buvid_fp_plain=undefined; buvid_fp=c27c0b59dd10dcdc4c14701a58f49669; LIVE_BUVID=AUTO6217111182462626; FEED_LIVE_VERSION=V_WATCHLATER_PIP_WINDOW3; bp_video_offset_691902317=925084214145056785; DedeUserID=691902317; DedeUserID__ckMd5=ead312019baad7ed; CURRENT_QUALITY=80; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTYwNDM3MDgsImlhdCI6MTcxNTc4NDQ0OCwicGx0IjotMX0.Rdjc9F5oiEXSn_GylRWm3s2L-Pn8GYfyQS5IZt_Y3-8; bili_ticket_expires=1716043648; SESSDATA=3d6f944f%2C1731336513%2C491d2%2A51CjD5jp6zedAz4nQallTN_akUjFzg2LzJhdKMiJbI1nnw2bs5sp8Y09F7Jj4PofjUyfsSVlktMkF0aDRLN196dVNTeWh0czllbFZTWDlidWRpcnFnaENSNVVNbGNFMGR5bFBqYkcwalhuVklyUGJLVHJtYXo3TVpaTENqQ21rS0RPbldWTDUzRFp3IIEC; bili_jct=2975523315e5bccfa606ac286df61f36; home_feed_column=4; browser_resolution=1396-639; sid=6gr3y4l0; PVID=4; bp_t_offset_691902317=932475264446758937; b_lsid=5E9C415B_18F86EC150D"
headers = {
        # Referer 防盗链 告诉服务器你请求链接是从哪里跳转过来的
        # "Referer": "https://www.bilibili.com/video/BV1454y187Er/",
        "Referer": url,
        # User-Agent 用户代理, 表示浏览器/设备基本身份信息
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Cookie": cookie
}
# 发送请求
response = requests.get(url=url, headers=headers)
html = response.text
print(html)
# 解析数据: 提取视频标题
title = re.findall('title="(.*?)"', html)[0]
print(title)
# 提取视频信息
info = re.findall('window.__playinfo__=(.*?)</script>', html)[0]
# info -> json字符串转成json字典
json_data = json.loads(info)
# 提取视频链接
video_url = json_data['data']['dash']['video'][0]['baseUrl']
print(video_url)
# 提取音频链接
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
print(audio_url)
video_content = requests.get(url=video_url, headers=headers).content
# 获取音频内容
audio_content = requests.get(url=audio_url, headers=headers).content
# 保存数据
with open('video\\' + title + '.mp4', mode='wb') as v:
    v.write(video_content)
with open('video\\' + title + '.mp3', mode='wb') as a:
    a.write(audio_content)

小结

希望我的讲解,大家能够看懂。

  • b站视频的爬取,我觉得最重要的就是去找到对应的网址,然后需要添加一些请求头,才能下载到本地且正常播放。
  • 本文没有将视频和音频合并起来。

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

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

相关文章

各位数字和-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第72讲。 各位数字和&#…

超简单白话文机器学习 - 回归树树剪枝(含算法介绍,公式,源代码实现以及调包实现)

1. 回归树 1.1 算法介绍 大家看到这篇文章时想必已经对树这个概念已经有基础了&#xff0c;如果不是很了解的朋友可以看看笔者的这篇文章&#xff1a; 超简单白话文机器学习-决策树算法全解&#xff08;含算法介绍&#xff0c;公式&#xff0c;源代码实现以及调包实现&#x…

软件设计师备考笔记(十):网络与信息安全基础知识

文章目录 一、网络概述二、网络互连硬件&#xff08;一&#xff09;网络的设备&#xff08;二&#xff09;网络的传输介质&#xff08;三&#xff09;组建网络 三、网络协议与标准&#xff08;一&#xff09;网络的标准与协议&#xff08;二&#xff09;TCP/IP协议簇 四、Inter…

大模型再进化,实时互动成为未来核心能力

就在上周&#xff0c;OpenAI 又在 AI 湖面抛下一块大石&#xff0c;激起了千层浪&#xff1a;全新一代旗舰生成模型 GPT-4o 登场了。从现场演示来看&#xff0c;它与人类进行了一轮轮无缝衔接的对话&#xff0c;丝滑得就像真人&#xff0c;不仅响应时间极短&#xff0c;还能识别…

SkyWalking 介绍及部署

1、SkyWalking简介2、SkyWalking的搭建 2.1 部署Elasticsearch2.2 部署SkyWalking-Server2.3 部署SkyWalking-UI3、应用接入 3.1 jar包部署方式3.2 dockerfile方式3.3 DockerFile示例4、SkyWalking UI 界面说明 4.1 仪表盘 4.1.1 APM &#xff08;1&#xff09;全局维度&#x…

IDEA中好用的插件

IDEA中好用的插件 CodeGeeXMybatis Smart Code Help ProAlibaba Java Coding Guidelines​(XenoAmess TPM)​通义灵码常用操作 CodeGeeX 官网地址&#xff1a;https://codegeex.cn/ 使用手册&#xff1a;https://zhipu-ai.feishu.cn/wiki/CuvxwUDDqiErQUkFO2Tc4walnZY 安装完…

欣赏倪诗韵青桐断纹古琴很罕见:万中无一。

欣赏倪诗韵青桐断纹古琴很罕见&#xff1a;万中无一。龙池侧签海门倪诗韵制&#xff0c;带收藏证书此琴断纹优美如江面波光粼粼&#xff0c;为流水蛇腹断&#xff0c;是倪老师作品精品中的精品。细心的朋友可以看出倪老师在这张琴上题字非常小心认真。用一个词来形容——万中无…

【Unity2D:Animator】为角色添加动画效果

一、添加Animator组件并创建Animator Controller文件 1. 添加Animator组件&#xff1a; 2. 在Assets-Art文件夹中新建一个名为Animations的文件夹&#xff0c;用来存储所有动画资源 3. 在Animations文件夹中新建一个名为Player的文件夹&#xff0c;再创建一个名为Animators的文…

通过RAG架构LLM应用程序

在之前的博客文章中&#xff0c;我们已经描述了嵌入是如何工作的&#xff0c;以及RAG技术是什么。本节我们我们将使用 LangChain 库以及 RAG 和嵌入技术在 Python 中构建一个简单的 LLM 应用程序。 我们将使用 LangChain 库在 Python 中构建一个简单的 LLM 应用程序。LangChai…

白鹭群优化算法,原理详解,MATLAB代码免费获取

白鹭群优化算法&#xff08;Egret Swarm Optimization Algorithm&#xff0c;ESOA&#xff09;是一种受自然启发的群智能优化算法。该算法从白鹭和白鹭的捕食行为出发&#xff0c;由三个主要部分组成:坐等策略、主动策略和判别条件。将ESOA算法与粒子群算法(PSO)、遗传算法(GA)…

提取COCO 数据集的部分类

1.python提取COCO数据集中特定的类 安装pycocotools github地址&#xff1a;https://github.com/philferriere/cocoapi pip install githttps://github.com/philferriere/cocoapi.git#subdirectoryPythonAPI若报错&#xff0c;pip install githttps://github.com/philferriere…

docker-如何将容器外的脚本放入容器内,将容器内的脚本放入容器外

文章目录 前言docker-如何将容器外的脚本放入容器内&#xff0c;将容器内的脚本放入容器外、1. docker 如何将容器外的脚本放入容器内1.1. 验证 2. 将容器内的脚本放入容器外 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&…

【AI绘画Stable Diffusion】单人LoRA模型训练,打造你的专属模型,新手入门宝典请收藏!

大家好&#xff0c;我是灵魂画师向阳 本期我将教大家如何进行LoRA模型训练&#xff0c;打造你的专属模型&#xff0c;内容比较干&#xff0c;还请耐心看完&#xff01; 随着AIGC的发展&#xff0c;许多传统工作岗位正逐渐被AI取代。同时&#xff0c;AI变革也在创造前所未有的…

机器学习知识与心得

目录 机器学习实践 机器学习基础理论和概念 机器学习基本方法 1.线性回归&#xff08;回归算法&#xff09; 训练集&#xff08;Training Set&#xff09; 测试集&#xff08;Test Set&#xff09; 交叉验证 正则化 特点 2.logistic回归&#xff08;分类算法&#xf…

智慧环保一体化平台哪家好?(已解答)

在环保行业数字化转型的大潮中&#xff0c;朗观视觉智慧环保一体化平台应运而生&#xff0c;成为推动环境治理现代化的重要手段。选择一个合适的智慧环保一体化平台对于提升环境管理效率、实现精细化监管具有重要意义。本文将从多个维度为您提供一份深度分析与选择指南&#xf…

Python使用virtualenv创建虚拟环境

目录 第一步&#xff1a;安装virtualenv 第二步&#xff1a;选择一个文件夹用来放所创建的虚拟环境 第三步&#xff1a;创建虚拟环境 第四步&#xff1a;激活虚拟环境 第五步&#xff1a;退出虚拟环境 第六步&#xff1a;测试安装django 前提&#xff1a;你得有个python环…

学习通高分免费刷课实操教程

文章目录 概要整体架构流程详细步骤云上全平台登录步骤小结 概要 我之前提到过一个通过浏览器的三个脚本就可以免费高分刷课的文章&#xff0c;由于不方便拍视频进行实操演示&#xff0c;然后写下了这个实操教程&#xff0c;之前的三个脚本划到文章末尾 整体架构流程 整体大…

windows安装rocketmq遇到的问题

运行mqnamesrv.cmd闪退问题。 首先检查是否安装java环境 cdm运行java -version 然后确定环境变量是否配置正确 如果这些地方都没问题那就比较麻烦了&#xff0c;可能是jdk版本&#xff08;小版本&#xff09;与rocketmq不匹配。 小编用的版本&#xff1a; jdk是openjdk 1.8…

DOS学习-目录与文件应用操作经典案例-type

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 1. 查看文本文件内容 2. 同时查看多个文本文件内容 3. 合并文…

mysql驱动版本变更导致查询数据结果一直是空

1 引言 最近接手了一个已离职同事的java项目&#xff0c;这个项目中原来使用了自己的mysql驱动版本&#xff0c;并未使用公司公共依赖中的版本号。我想为了统一版本号&#xff0c;就将当前项目中pom文件中mysql的版本号verson给去除了。没怎么自测&#xff0c;就直接发到测试环…