《0基础》学习Python——第二十三讲__网络爬虫/<6>爬取哔哩哔哩视频

一、在B站上爬取一段视频(B站视频有音频和视频两个部分)

        1、获取URL

        注意:很多平台都有反爬取的机制,B站也不例外

        首先按下F12找到第一条复制URL

        2、UA伪装,下列图片中(注意代码书写格式)

        3、Cookie,

        在上节课以及说了Cookie这个东西,需要我们登录后的复制的才有用,其需要在左侧找到web对应的页面找到,如下图所示:

        4、防盗链:

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

        防盗链是指通过设置HTTP请求的Referer头字段来限制其他网站对自身网站资源的访问。在爬取数据时,开发者可以在HTTP请求中添加Referer字段,告知服务器请求的来源页面。服务器会检查Referer字段来判断请求是否来自合法的来源页面,如果不合法,服务器可能会拒绝该请求或返回错误信息。

而最上面第二张图里的红色框就是Referer,将它复制过来就可以了

注意:User-Agent、Cookie、Referer需要写在head里传入get请求属性内,必须字母大小写完全一致

head={#UA伪装'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',#防盗链'Referer':'https://www.bilibili.com/video/BV1Hm421g7Uk/?spm_id_from=333.1007.tianma.10-1-35.click',#Cookie,用户登录信息'Cookie':"buvid3=380A54AC-1380-1A80-3501-B4D8CCABA7BF29897infoc; b_nut=1720504429; _uuid=13E92EE8-61F4-5115-D85B-AA5944A8C35D29991infoc; enable_web_push=DISABLE; buvid4=D79928A9-BA71-3CF7-EF1B-C8E41318CF0731079-024070905-IYJQtQw8DTdtrI0uY1UGvQ%3D%3D; b_lsid=1A3CF2B8_190D4BF05FC; bsource=search_bing; header_theme_version=CLOSE; CURRENT_FNVAL=4048; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjE4MTU0MTksImlhdCI6MTcyMTU1NjE1OSwicGx0IjotMX0.ExMDwTuyn9PYFV0sqW9gxFH4UDmKR-BkkgHHmOAIGls; bili_ticket_expires=1721815359; sid=8q9u9sec; home_feed_column=5; browser_resolution=1488-755; is-2022-channel=1; rpdid=|(Y|RJRl|k|0J'u~kullYJul; fingerprint=3413b6ee321fed7d51121223b51b31f5; buvid_fp_plain=undefined; buvid_fp=3413b6ee321fed7d51121223b51b31f5"}

        5、content-type类型的查看:

        同样是在左侧web标签页下寻找,可以发现当前页面是text类型:

此处代码实现如下:

import requestsif __name__ == '__main__':url='https://www.bilibili.com/video/BV1Hm421g7Uk/?spm_id_from=333.1007.tianma.10-1-35.click'head={#UA伪装'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',#防盗链'Referer':'https://www.bilibili.com/video/BV1Hm421g7Uk/?spm_id_from=333.1007.tianma.10-1-35.click',#Cookie,用户登录信息'Cookie':"buvid3=380A54AC-1380-1A80-3501-B4D8CCABA7BF29897infoc; b_nut=1720504429; _uuid=13E92EE8-61F4-5115-D85B-AA5944A8C35D29991infoc; enable_web_push=DISABLE; buvid4=D79928A9-BA71-3CF7-EF1B-C8E41318CF0731079-024070905-IYJQtQw8DTdtrI0uY1UGvQ%3D%3D; b_lsid=1A3CF2B8_190D4BF05FC; bsource=search_bing; header_theme_version=CLOSE; CURRENT_FNVAL=4048; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjE4MTU0MTksImlhdCI6MTcyMTU1NjE1OSwicGx0IjotMX0.ExMDwTuyn9PYFV0sqW9gxFH4UDmKR-BkkgHHmOAIGls; bili_ticket_expires=1721815359; sid=8q9u9sec; home_feed_column=5; browser_resolution=1488-755; is-2022-channel=1; rpdid=|(Y|RJRl|k|0J'u~kullYJul; fingerprint=3413b6ee321fed7d51121223b51b31f5; buvid_fp_plain=undefined; buvid_fp=3413b6ee321fed7d51121223b51b31f5"}#发送get请求response=requests.get(url,headers=head)res_txt=response.text#打印获取到的数据print(res_txt)

代码打印的结果为:

如此便是正确的爬取到了视频网页的内容,接下来便可以接着进行下一步

        6、找到视频和音频地址

        B站视频是和音频分开的,所以需要我们额外去找,点击F12后在第一条的响应里右边滚轮拖到最顶端,找到这个界面:

在这个标签下可以发现video

video标签这里的baseUrl就是视频的地址,继续下拉会发现这个audio这个标签,这下面baseUrl存放的就是音频的地址

7、定位到需要内容页面

注意:这一步的目的就是为了找到上面的视频和音频的baseUrl,因为视频存放地址的代码基本在这个平台基本都是一致的,所以为了爬取更多的B站的视频就需要快速定位到视频URL,而不需要像上一点那样一条一条找每个视频的URL。

打开元素页面找到head标签下的第四个script标签,这里存放的使我们需要的内容,如下列图片,其类似于上节课xpath所有的li标签的内容

有了这么多的数据就可以开始写代码了

首先我们获取到了res_txt内容,那么便去用etree解析这段内容,然后在对xpath返回的列表用join去除括号处理得到字符串,然后前面那段(window.__playinfo__=)内容我们不需要,所以用索引去除,去除后得到的是json大字符串,可以将它转换成字典

#解析获取的数据
tree=etree.HTML(res_txt)
#利用xpath找到视频地址
base_info="".join(tree.xpath('/html/head/script[4]/text()'))[20:]
print(base_info)

打印后得到的内容如下,可以看出他是一个json字符串

然后用json.loads()将其转换成字典,代码如下

#将json大字符串转换成字典类型,然后通过键取值
video_url=json.loads(base_info)['date']['dash']['video'][0]['baseUrl']
audio_url = json.loads(base_info)["data"]["dash"]['audio'][0]["baseUrl"]

其中json.loads(base_info)是将base_info转化成字典的形式,后面的['date']['dash']['video']则是字典的键,而video键所对应的值为列表,而我们所需要的videoUrl就在这个列表的第一个元素的字典里,所以索引为0得到另一个字典,另一个字典中的["baseUrl"]则对于我们所需要的video_url,具体可通过下图来直观解释:

同样可以通过这个方法找到音频的URL,然后在通过这些URL发送get请求得到音频和视频的二进制编码,再将这些编码写入文件,即可得到视频文件和音频文件,其后缀名都为mp4格式,如下代码即可获取视频和音频的全部二进制数据

#将json大字符串转换成字典类型,然后通过键取值得到音频和视频的URL
video_url=json.loads(base_info)['date']['dash']['video'][0]['baseUrl']
audio_url = json.loads(base_info)["data"]["dash"]['audio'][0]["baseUrl"]#发送get请求获取音频和视频的数据
video_re=requests.get(video_url,headers=head)
audio_re=requests.get(audio_url,headers=head)video_con=video_re.content
audio_con=audio_re.content

然后再创建mp4文件,将这些数据存放进去,即可完成视频爬取,后期在通过音视频合成工具将两个内容合并即可

with open('./video.mp4','wb') as f:f.write(video_con)with open('./audio.mp4','wb') as fp:fp.write(audio_con)

点击运行以后即可在左侧文件夹中找到两个mp4音视频文件

需要在当前代码存放文件夹内打开,而不是再pycharm编译器内打开

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

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

相关文章

ViT(Vision Transformer)网络结构详解

本文在transformer的基础上对ViT进行讲解,transformer相关部分可以看我另一篇博客(transformer中对于QKV的个人理解-CSDN博客)。 一、网络结构概览 上图展示了Vision Transformer (ViT) 的基本架构,我按照运行顺序分为三个板块进…

Rancher

文章目录 Rancher1. 安装和配置2. 服务部署和管理3. 容器自动化缩容和扩容 Rancher Rancher 是一个开源的企业级容器管理平台,旨在简化容器化应用的部署、管理和运维。它支持多种容器编排引擎,如 Kubernetes、Docker Swarm 等,并提供了统一的…

自动驾驶系统开发与调试:车路云一体化无人驾驶挑战赛参赛体验

点击蓝字 关注我们 在过去的几年里,自动驾驶技术在全球范围内吸引了大量关注。其潜力不仅在于提升行车安全,而且还可以改变我们的出行方式和城市规划,提高交通运输效率。国际汽车工程师学会(SAE)根据不同自动驾驶程度&…

JAVA在线文档

1.存在码 JDK21中文API 2.全栈行动派 JDK17中文API 3.mklab.cn JDK11中文API JDK8中文API JDK7-21英文API 4.docs.oracle.com JDK7-22英文文档

项目笔记| 基于Arduino和IR2101的无刷直流电机控制器

本文介绍如何使用 Arduino UNO 板构建无传感器无刷直流 (BLDC) 电机控制器或简单的 ESC(电子速度控制器)。 无刷直流电机有两种类型:有传感器和无传感器。有感无刷直流电机内置3个霍尔效应传感器,这些传感…

MLIR的TOY教程学习笔记

MLIR TOY Language 文章目录 MLIR TOY Language如何编译该项目ch1: MLIR 前端IR解析ch2: 定义方言和算子 (ODS)1. 定义方言2. 定义OP3. OP相关操作4. 定义OP ODS (Operation Definition Specification)1. 基本定义2. 添加文档3. 验证OP4. 新增构造函数5. 定义打印OP的格式 ch3:…

【机器学习】超参数选择:解锁机器学习模型潜力的关键

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 超参数选择:解锁机器学习模型潜力的关键引言什么是超参数&#xff1…

计算机的错误计算(三十八)

摘要 计算机的错误计算(十九)指出:两个等价大数相减,差不是正确值0,而是一个大数。本节用 Python的 torch库中函数进行计算验证,进一步说明错误的一般性。 例1. 在Windows10,Python 3.12.4 下…

Android APP Camerax应用(02)预览流程

说明:camera子系统 系列文章针对Android12.0系统,主要针对 camerax API框架进行解读。 1 CameraX简介 1.1 CameraX 预览流程简要解读 CameraX 是 Android 上的一个 Jetpack 支持库,它提供了一套统一的 API 来处理相机功能,无论 …

【HarmonyOS NEXT】网络请求 - 分页加载

分页加载关键字:onReachEnd 一、申请网络权限 在 module.json5 文件中,添加网络权限: {"module": {..."requestPermissions": [{"name": "ohos.permission.INTERNET","usedScene": {&qu…

网络安全常用易混术语定义与解读(Top 20)

没有网络安全就没有国家安全,网络安全已成为每个人都重视的话题。随着技术的飞速发展,各种网络攻击手段层出不穷,保护个人和企业的信息安全显得尤为重要。然而,在这个复杂的领域中,许多专业术语往往让人感到困惑。为了…

portainer教程-docker可视化管理工具

很多朋友刚接触docker 学习,就想问 docker有图形化界面吗 ,答案是肯定的, 这里白眉大叔 给大家推荐 Docker可视化管理平台 -- Portainer 1- 运行Portainer: docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restarta…

【保姆级讲解C语言中的运算符的优先级!】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🪶C语言中的运算符的优先级 🪶C语言中的运算符的优先级决定了…

二、C#数据类型

本文是网页版《C# 12.0 本质论》第二章解读。欲完整跟踪本系列文章,请关注并订阅我的Essential C# 12.0解读专栏。 前言 数据类型(Data Type)是一个很恼人的话题。 似乎根本没必要对数据类型进行展开讲解,因为人人都懂。 但是…

grafana大坑,es找不到时间戳 | No date field named timestamp found

grafana大坑,es找不到时间戳。最近我这边的es重新装了一遍,结果发现grafana连不上elasticsearch了(以下简称es),排查问题查了好久一直以为是es没有装成功或者两边的版本不兼容,最后才发现是数值类型问题 一…

浅聊 Three.js 屏幕空间反射SSR-SSRShader

浅聊 Three.js 屏幕空间反射SSR(2)-SSRShader 前置基础 渲染管线中的相机和屏幕示意图 -Z (相机朝向的方向)||| -------------- <- 屏幕/投影平面| | || | || | (f) | <- 焦距| | ||…

【BUG】已解决:error: legacy - install - failure

error: legacy - install - failure 目录 error: legacy - install - failure 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&…

51单片机14(独立按键实验)

一、按键介绍 1、按键是一种电子开关&#xff0c;使用的时候&#xff0c;只要轻轻的按下我们的这个按钮&#xff0c;按钮就可以使这个开关导通。 2、当松开这个手的时候&#xff0c;我们的这个开关&#xff0c;就断开开发板上使用的这个按键&#xff0c;它的内部结构&#xff…

免费分享:2021年度全国城乡划分代码(附下载方法)

《关于统计上划分城乡的规定》指出&#xff1a;“本规定作为统计上划分城乡的依据&#xff0c;不改变现有的行政区划、隶属关系、管理权限和机构编制&#xff0c;以及土地规划、城乡规划等有关规定”。统计用区划代码和城乡划分代码用于统计工作&#xff0c;需要在其他工作中使…

回溯题目的套路总结

前言 昨天写完了LeeCode的7&#xff0c;8道回溯算法的题目&#xff0c;写一下总结&#xff0c;这类题目的共同特点就是暴力搜索问题&#xff0c;排列组合或者递归&#xff0c;枚举出所有可能的答案&#xff0c;思路很简单&#xff0c;实现起来的套路也很通用&#xff0c;一…