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

news2024/12/26 13:50:38

一、在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 requests

if __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.coloradmin.cn/o/1939769.html

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

相关文章

【2024】springboot O2O生鲜食品订购

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

sass版本更新,不推荐使用嵌套规则后的声明

目前在 Sass 中不推荐使用嵌套规则后的声明,在 为了通知用户即将进行的更改,并给他们时间进行更改 与之兼容的样式表。在未来的版本中,Dart Sass 将更改为 匹配纯 CSS 嵌套生成的顺序。Deprecation Warning: Sasss behavior for declarations…

视频点播项目

文章目录 视频点播技术栈与项目环境JsonCppMariaDBhttplib 工具类设计文件类Json类 数据管理模块视频信息管理(数据表设计)数据管理类设计 网络通信接口设计业务处理模块设计前端界面主页面播放页面 项目总结项目回顾项目结构关键技术点总结 视频点播 允…

el-table表头使用el-dropdown出现两个下拉框

问题描述:el-table在固定右边列时,表头使用el-dropdown会出现两个下拉框,如图所示: 解决方法: 1.只显示第一个下拉框,通过控制样式将其他的下拉框display:none; 2.如图所示,修改插槽写法&…

SpringBoot源码深度解析

今天,聊聊SpringBoot的源码,本博客聊的版本为v2.0.3.RELEASE。目前SpringBoot的最新版为v3.3.2,可能目前有些公司使用的SpringBoot版本高于我这个版本。但是没关系,因为版本越新,新增的功能越多,反而对Spri…

如何将几百兆的包优化到几十兆----记一次vue项目的打包优化过程

打包优化 现象 前段时间开发的时候遇到客户反馈的一个问题 界面无法打开,显示白屏,控制台无报错 经过我们在开发环境,测试环境反复测试都没复现出客户的问题,然后我们又不停的在生产环境上找问题,也没复现出来 最…

一文带你读懂MLIR论文,理解MLIR设计准则.

论文MLIR: Scaling Compiler Infrastructure for Domain Specific Computation MLIR:针对特定领域计算扩展编译器基础设施 文章目录 论文MLIR: Scaling Compiler Infrastructure for Domain Specific Computation1. 论文下载2. TVM关于MLIR的讨论3. 论文正文0. 摘要…

5个人人都应该学会的电脑小技巧

今天分享几个电脑常用的快捷键,可以让你的工作事半功倍,建议收藏! 不想被突然来的人看到正在浏览的网站,用CtrlW或者AltF4可以关闭当前页面,另外如果你正在看小电影也可以用这个办法关闭。 2. 同事或大Boos走了之后想…

Anthropic的Claude安卓版能否赢得用户青睐?

Anthropic的Claude安卓版能否赢得用户青睐? 前言 Anthropic 就在7月18日,这家以"可控AI"著称的初创公司再次出手,推出了Claude的Android版本应用。这款APP不仅支持实时语言翻译,更传承了Anthropic一贯的隐私保护政策。C…

腾讯云COS托管静态网站,以及如何解决访问出现了下载网页的情况

腾讯云对象存储(Cloud Object Storage,简称COS),与其他云厂商所提供的云对象存储都是面向非结构化数据,只是每个云厂商的叫法有别于他家,或许是更能彰显厂商的品牌吧! 但不管云厂商怎么给云对象…

错误:PHP:Deprecated: Required parameter $xxx follows optional parameter $yyy

前言 略 错误 Deprecated: Required parameter $xxx follows optional parameter $yyy 解决办法 设置 error_reporting E_ALL & ~E_DEPRECATED & ~E_STRICT 参考 https://blog.csdn.net/lxw1844912514/article/details/100028023

MATLAB学习日志DAY13

13.矩阵索引(1) 13.1 下标 上图! A 的行 i 和列 j 中的元素通过 A(i,j) 表示。 例如,A(4,2) 表示第四行和第二列中的数字。 在幻方矩阵中, A(4,2) 为 15。 A(1,4) A(2,4) A(3,4) A(4,4) 用来计算 A 第四列中的…

【PG】PostgreSQL高可用之repmgr事件通知

目录 描述 结合脚本 占位符 repmgr命令 生成的事件: repmgrd 生成的事件(流复制模式): 描述 每次repmgr或repmgrd执行重大事件时,都会将该事件的记录连同时间戳、失败或成功的标识以及进一步的详细信息&#xff08…

黑马商城启动流程(微服务拆分项目)

1.虚拟机ssh(docker中布置了 mysql nacos seata(分布式事务)三个容器在同一个网络hm-net中) 2.idea(启动所有的微服务项目 ) 3.nginx 在cmd上启动 4.navicat 连接数据库 5.登录前端页面 http://localho…

Stable Diffusion AI入门介绍

Stable Diffusion模型 在上一篇的文章中我们介绍了,AIGC的相关知识以及AI绘画的历史——AIGC是什么,与AI绘画有什么关系,一篇文章带你了解AI绘画的前世今生。 我们知道了Stable Diffusion是一种潜在扩散模型,由慕尼黑大学的Comp…

将github上的项目导入到vscode并创建虚拟环境

1、将github上的项目导入到vscode 直接从github上下载到本地&#xff0c;用vscode打开&#xff08;Open file&#xff09; 2、创建虚拟环境 python -m venv <name> <name>\Scripts\activate ps: 1、退出虚拟环境 deactivate 2、如果运行python -m venv <…

【数据结构】详解堆

一、堆的概念 堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵 完全二叉树的 数组对象。 堆是非线性数据结构&#xff0c;相当于一维数组&#xff0c;有两个直接后继。 如果有一个关键码的集合K { k₀&#xff0c;k₁&#xff0c;k₂ &#xff0…

统信UOS

统信UOS 如何检测是否为适配的cpu 打开国产系统或linux系统的终端&#xff0c; 输入&#xff1a; uname -m 如&#xff1a; 软件安装 把下载的压缩包解压到当前目录 如果您确认电脑cpu为ARM64架构CPU:【飞腾、鲲鹏、海思麒麟、瑞芯微】&#xff0c; 请双击com.agicall.ub-ph…

JVM--双亲委派模型

1.双亲委派模型 定义&#xff1a; 站在Java虚拟机的角度来看&#xff0c;只存在两种不同的类加载器&#xff1a;一种是启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;&#xff0c;这个类加载器使用C语言实现&#xff0c;是虚拟机自身的一部分&#xff1b;另外一种…

【C++】一、Visual Studio 2017使用教程:内存窗口、预处理文件、obj文件,调试优化

文章目录 概述编译期&#xff08;Compile&#xff09;查看预处理后的文件查看obj文件开启编译器调试优化 链接期&#xff08;Linking&#xff09;报错信息概述自定义入口点 调试内存窗口值转16进制查看查看汇编代码 注意 概述 记录一下Cherno的vs配置下载地址 https://thecher…