《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…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...