《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编译器内打开
![]()
![]()
相关文章:
《0基础》学习Python——第二十三讲__网络爬虫/<6>爬取哔哩哔哩视频
一、在B站上爬取一段视频(B站视频有音频和视频两个部分) 1、获取URL 注意:很多平台都有反爬取的机制,B站也不例外 首先按下F12找到第一条复制URL 2、UA伪装,下列图片中(注意代码书写格式) 3、Co…...
第13周 简历职位功能开发与Zookeeper实战
第13周 简历职位功能开发与Zookeeper实战 本章概述1. Mysql8窗口函数over使用1.1 演示表结构与数据1.2 案例1:获取男女总分数1.3 案例2****************************************************************************************本章概述 1. Mysql8窗口函数over使用 参考案例…...
什么是大型语言模型 (LLM)
本章探讨下,人工智能如何彻底改变我们理解和与语言互动的方式 大型语言模型 (LLM) 代表了人工智能的突破,它采用具有广泛参数的神经网络技术进行高级语言处理。 本文探讨了 LLM 的演变、架构、应用和挑战,重点关注其在自然语言处理 (NLP) 领…...
【人工智能】AI时代:探索个人潜能的新视角
文章目录 🍊Al时代的个人发展1 AI的高速发展意味着什么1.1 生产力大幅提升1.2 生产关系的改变1.3 产品范式1.4 产业革命1.5 Al的局限性1.5.1局限一:大模型的幻觉1.5.2 局限二:Token 2 个体如何应对这种改变?2.1 职场人2.2 K12家长2.3 大学生2.4 创业者 …...
pyaudio VAD通过声音音频值分贝大小检测没人说话自动停止录制
效果可能说话声音小可能不被监听到,需要更改QUIET_DB阈值,另外delay_time值是低于阈值多久就可以停止保存当前的语音 import pyaudio import waveimport sys import numpy as npdef record_auto(MIC_INDEX=1):开启麦克风录音,保存至temp/speech_record.wav音频文件音量超过…...
《后端程序猿 · @Value 注释说明》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
【LeetCode】71.简化路径
1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码: class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…...
DockerCompose 安装环境
1. Redis version: 3 services:redis:image: redis:6.2.12container_name: redisports:- "6379:6379"environment:TZ: Asia/Shanghaivolumes:# 本地数据目录要先执行 chmod 777 /usr/local/docker/redis/data 赋予读写权限,否则将无法写入数据- /usr/loc…...
学习笔记之JAVA篇(0724)
p 方法 方法声明格式: [修饰符1 修饰符2 ...] 返回值类型 方法名(形式参数列表){ java语句;......; } 方法调用方式 普通方法对象.方法名(实参列表)静态方法类名.方法名(实参列表) 方法的详…...
【Android】广播机制
【Android】广播机制 前言 广播机制是Android中一种非常重要的通信机制,用于在应用程序之间或应用程序的不同组件之间传递信息。广播可以是系统广播,也可以是自定义广播。广播机制主要包括标准广播和有序广播两种类型。 简介 在Android中,…...
【.NET全栈】ASP.NET开发Web应用——ASP.NET数据绑定技术
文章目录 前言一、绑定技术基础1、单值绑定2、重复值绑定 二、数据源控件1、数据绑定的页面生存周期2、SqlDataSource3、使用参数过滤数据4、更新数据和并发处理5、编程执行SqlDataSource命令6、ObjectDataSource控件介绍7、创建业务对象类8、在ObiectDataSource中使用参数9、使…...
MySQL的账户管理
目录 1 密码策略 1.1 查看数据库当前密码策略: 1.2 查看密码设置策略 1.3 密码强度检查等级解释(validate_password.policy) 2 新建登录账户 3 账户授权 3.1 赋权原则 3.2 常见的用户权限 3.3 查看权限 3.4 赋权语法 4 实例 4.1 示例1&#x…...
FastGPT 源码调试配置
目录 一、添加 launch.json 文件 二、调试 本文简单介绍如何通过 vscode 对 FastGPT 进行调试。 这里假设已经安装 vsocde 和 FastGPT本地部署。 一、添加 launch.json 文件 vscode 打开 FastGPT 项目,点击 调试 -> 显示所有自动调试配置 -> 添加配置 -> Node.j…...
SQL Server数据迁移新纪元:数据库数据泵(Data Pump)使用指南
SQL Server数据迁移新纪元:数据库数据泵(Data Pump)使用指南 在数据管理的世界里,数据迁移是一个常见且复杂的过程。SQL Server提供了一个强大的工具——数据库数据泵(Data Pump),它可以帮助我…...
Android性能优化之OOM
OOM 什么是OOM?为什么会有OOM?APP的内存限制App的内存限制是多少? 为什么Android系统要设定App的内存限制?Android有GC自动回收资源,为什么还会OOM?容易发生OOM的场景及处理方案如何避免OOM? 什么是OOM&am…...
代码随想录算法训练营day7 | 454.四数相加II、383.赎金信、15.三数之和、18.四数之和
文章目录 454.四数相加II思路 383.赎金信思路 15.三数之和思路剪枝去重 18.四数之和思路剪枝去重复习:C中的类型转换方法 总结 今天是哈希表专题的第二天 废话不多说,直接上题目 454.四数相加II 建议:本题是 使用map 巧妙解决的问题&#x…...
Spark实时(三):Structured Streaming入门案例
文章目录 Structured Streaming入门案例 一、Scala代码如下 二、Java 代码如下 三、以上代码注意点如下 Structured Streaming入门案例 我们使用Structured Streaming来监控socket数据统计WordCount。这里我们使用Spark版本为3.4.3版本,首先在Maven pom文件中导…...
《Java初阶数据结构》----4.<线性表---Stack栈和Queue队列>
前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…...
Android SurfaceFlinger——关联EGL三要素(二十七)
通过前面的文章我们得到了 EGL 的三要素——Display、Surface 和 Context。其中,Display 是一个图形显示系统或者硬件屏幕,Surface 代表一个可以被渲染的图像缓冲区,Context 包含了 OpenGL ES 的状态信息和资源,它是执行 OpenGL 命令的环境。下一步就是调用 eglMakeCurrent…...
Unity3D之TCP网络通信(客户端)
文章目录 概述TCP核心类异步机制 Unity中创建TCP客户端Unity中其它脚本获取TCP客户端接受到的数据后续改进 本文将以Unity3D应用项目作为客户端去连接制定的服务器为例进行相关说明。 Unity官网参考资料: https://developer.unity.cn/projects/6572ea1bedbc2a001ef…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
