4.用python爬取保存在text中的格式为m3u8的视频

文章目录

  • 一、爬取过程详解
    • 1.寻找视频的m3u8链接
    • 2.从网页源码中寻找视频的m3u8链接的第二部分内容
    • 3.从视频的m3u8链接获取视频
  • 二、完整的代码


一、爬取过程详解

1.寻找视频的m3u8链接

这个文档承接了爬虫专栏的 第一节.python爬虫爬取视频网站的视频可下载的源url,首先我们打开一个爬取的可以播放的视频链接,然后按F12,然后选择Network,可以看到这个网站的视频不是mp4格式的视频,而是m3u8格式的视频流,这样就不能按照mp4格式那样直接下载了,就需要下载视频流的所有视频文件然后合并得到视频。
具体的,在打开了Network后,我们可以看到一个为m3u8的文件,点开这个m3u8,这个链接就是我们真实的要获取的视频信息的链接。如下图所示。可以看到,视频的链接(1)和和视频的请求链接(3)不是同一个,这是网站做了加密的处理,也是防止爬取的一种手段。但是这个其实很简单的可以寻找到规律。
我们以图中的链接为例https://v.cdnlz3.com/20240503/23140_990db975/2000k/hls/mixed.m3u8,我们打开多个爬取的不同的视频的下载链接,以同样的方式查看其m3u8链接会发现,会发现不同的视频的m3u8的链接其实都是很相似的,链接可以拆为三部分,https://v.cdnlz3.com/+20240503/23140_990db975/+ 2000k/hls/mixed.m3u8
其中第一部分和爬取的视频的下载链接的v.cdnlz3.com/share/3893f9f84823afc5f68339ed89374d81的前面是一致的,这个信息我们已经有了,然后第三部分所有视频m3u8链接都是相同的,这个我们也有了。唯一需要寻找的信息就是第二部分的那段了。所以接下来我们就从源代码中寻找这部分的内容。
在这里插入图片描述

2.从网页源码中寻找视频的m3u8链接的第二部分内容

我们直接在F12中源码中搜索我们要找的内容20240503/23140_990db975/,直接就定位到了我们要找的位置了。由于这个内容也是js中渲染出来的,所以我们还是要使用requests_html来渲染网站从而获得视频的第二部分信息。然后将三部分拼起来就是视频的m3u8的链接https://v.cdnlz3.com/20240503/23140_990db975/2000k/hls/mixed.m3u8
在这里插入图片描述

3.从视频的m3u8链接获取视频

我们执行一下代码:

	resp = requests.get(m3u8_url, headers)data = resp.textprint(data)

得到输出,输出的所有结尾为ts的名字就是我们要爬取的所有的ts视频,我们将上面的m3u8链接https://v.cdnlz3.com/20240503/23140_990db975/2000k/hls/mixed.m3u8的最后的mixed.m3u8换成爬取到的.ts就可以得到一个视频片段,然后按顺序依次获得所有的视频片段并拼接就可以得到完整的视频了。
在这里插入图片描述

二、完整的代码

from requests_html import HTMLSession
import requests_html
from bs4 import BeautifulSoup
import os
import requests
import randomif __name__ == '__main__':user_agent_list = [# 在这里可以写多个headers,然后随机选一个进行访问,这样可以防止频繁访问ip被封"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",]headers = {'user-agent': random.choice(user_agent_list),'Connection': 'close'}# 放视频下载链接的文件夹路径url_path = 'D:\\project\\爬虫\\爬取的视频'# 下载视频的保存路径save_path = 'D:\\project\\爬虫\\video'# 读取放视频下载链接的文件夹下的所有text文件filenames = os.listdir(url_path)for filename in filenames:print(filename)with open(os.path.join(url_path, filename), 'r') as file:# 读取text文件内容content = file.read()# try:session = HTMLSession()first_page = session.get(content)first_page.html.render(sleep=1)  # 留出网页渲染的时间session.close()soup = BeautifulSoup(first_page.html.html, features="lxml")  # 这里要用lxmlvideo_url = soup.findAll('script', attrs={'type': 'text/javascript'})video_url = video_url[2].stringlines = video_url.splitlines()key_url = lines[16][24:49]# print(key_url)content = content.split('/')# 爬取的有的视频的播放链接为空,所以进行一下异常测试try:head_url = content[0]+ '//' + content[2]except:print('链接无效')# print(head_url)m3u8_url = f'{head_url}{key_url}2000k/hls/mixed.m3u8'# print(m3u8_url)resp = requests.get(m3u8_url, headers)data = resp.text#print(data)url2 = f'{head_url}{key_url}2000k/hls/'index = 0for ts in data.splitlines():if ts[0] != '#':print(ts)index = index + 1url_add = url2 + tsprint(url_add)res = requests.get(url_add, headers=headers)data = res.contentwith open(os.path.join(save_path, filename+'.ts'), 'ab+') as f:f.write(data)f.flush()print("写入第{}文件成功".format(index))print("视频{}下载完毕!!!".format(filename))

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

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

相关文章

车规级低功耗汽车用晶振SG-9101CGA

车规级晶振SG-9101CGA属于爱普生9101系列,是一款可编程晶振。SG-9101CGA车规级晶振采用2.5x2.0mm封装,利用PLL技术生产,此款振荡器的频率范围从0.67M~170MHZ任一频点可选,步进1ppm,采用标准CMOS输出,最大输…

为 Flutter 应用设置主题:ThemeData 和 ColorScheme 指南

在媒体和其他来源中有许多关于这个主题的文章,那么这篇文章的必要性是什么? 在本文中,我计划仅关注 ThemeData 小部件的关键点以及我的开发经验中最常用的参数,并且您将获得有关每个参数如何对您的应用程序执行操作的简要说明。 …

分类任务的基础学习

1.什么是分类? 2.局限性: 当样本量逐渐变大的时候,准确率会下降——>因为线性回归曲线距离我们的原点越远,预测就会开始不准确,因为 x前面的倍数就会越来越小,这就导致了样本量变大,但是那些…

Kafka 业务日志采集最佳实践

简介 Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据流管道和应用程序。在收集业务日志的场景中,Kafka 可以作为一个消息中间件,用于接收、存储和转发大量的日志数据。将 Kafka 与其他系统(如 Elasticsearch、Flume、…

Nginx启动后不能正常访问

背景介绍 新增NGINX配置文件后,重启nginx无法访问服务。NGINX启动不报错,测试nginx配置文件nginx -t也没问题。 定位问题思路与步骤 查看NGINX配置文件 发现NGINX配置文件中的user是www user www www;查看NGINX相关文件夹的权限 发现有些文件的所…

docker-compose安装 人大金仓数据库

下载官网安装包 将安装包重命名为: kingbase.tar 再导入镜像仓库 docker load -i kingbase.tar目录创建data文件夹创建docker-compose文件 version: 3 services: kingbase: image: kingbase:v1 container_name: kingbaseports: - "54321:54321" volumes: -…

解决微信小程序电脑能正常使用,手机端无法正常访问的SSL证书问题

目录 前言1 问题描述与调试2 探索问题根源2.1 用户反馈收集2.2 尝试手机端访问2.3 PC端调试 3 确认问题与解决方案3.1 检查SSL证书3.2 重新部署SSL证书3.3 测试修复效果 4 SSL(Secure Sockets Layer)证书中间证书4.1 SSL证书链的构成4.2 中间证书的作用 …

【管理咨询宝藏97】智慧物流园区顶层设计方案

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏97】智慧物流园区顶层设计方案 【格式】PDF版本 【关键词】智慧园区、制造型企业转型、数字化转型 【核心观点】 - 中国物流业整体呈现集中度低…

springboot项目 字典/枚举翻译 终极解决方案 AOP+自定义注解+递归实体字段+实体动态三级缓存+责任链+多种转换方式

目录 前言实现思路技术确定 食用方式效果使用样例项目中使用第一步 复制包第二步 实现LoadDictDatabase并将其注入容器第三步 标识需要翻译的字段第四步 标识需要翻译的方法第五步 调用需要翻译的方法 实现细节TODO 前言 字典,即在存储介质中进行存储时,为了避免业务上对其名称…

数据结构复习指导之二叉树的概念

文章目录 二叉树 考纲内容 复习提示 1.二叉树的概念 1.1二叉树的定义及其主要特性 1.1.1二叉树的定义 1.1.2几种特殊的二叉树 1.1.3二叉树的性质 1.2二叉树的存储结构 1.2.1顺序存储结构 1.2.2链式存储结构 知识回顾 二叉树 考纲内容 (一)树…

LeetCode 每日一题 2024/4/29-2024/5/5

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 4/291146. 快照数组4/30 2798. 满足目标工作时长的员工数目5/1 2462. 雇佣 K 位工人的总代价5/2 857. 雇佣 K 名工人的最低成本5/3 1491. 去掉最低工资和最高工资后的工资平…

苹果Mac用户下载VS Code(Universal、Intel Chip、Apple Silicon)哪个版本?

苹果macOS用户既可以下载通用版(Universal),软件将自动检测用户的处理器并进行适配。 也可以根据型号下载对应CPU的版本: 使用Intel CPU的Mac电脑可下载Intel Chip版本; 使用苹果自研M系列CPU的Mac电脑下载Apple Si…

Oracle Patch清理

场景: 在对Oracle安装补丁后,会发现OS上被占用了大量的空间,本文档清理Opatch过程中的一些文件,释放空间 参考文档: Can You Delete $ORACLE_HOME/.patch_storage Directory ? (Doc ID 403218.1) How To Avoid Disk …

【Redis7】10大数据类型之Hash类型

文章目录 1.Hash类型2.常用命令3.示例hset和hgethgetallhlenhkeys和hvalshexistshdelhincrby和hincrbyfloathsetnx 1.Hash类型 Redis中的Hash类型是一种高效的数据结构,用于存储键值对的集合。这种类型特别适用于表示对象,因为它允许你将对象的多个属性…

Context capture/Pix4Dmapper/AutoCAD/CASS/EPS软件的安装流程与使用方法;土方量计算;无人机摄影测量数据处理

目录 专题一 无人机摄影测量技术应用现状及其发展 专题二 基本原理和关键技术讲解 专题三 无人机影像外业数据获取 专题四 数据处理环境建立与软件熟悉 专题五 GNSS数据土方量计算 专题六 基于无人机影像数据的正射影像制作 专题七 基于无人机影像数据的三维模型制作 专…

gocator导出图片

想用3D扫描后的图片,但是系统自带的导出方法很麻烦,所以考虑通过sdk导出 首先需要设置点云亮度 这里是导出图片的关键代码 case GoDataMessageType.SurfaceIntensity: { Debug.WriteLine("SurfaceIntensity "); GoSu…

线段树专题

落谷1607 #include<bits/stdc.h> using namespace std;#define ls u<<1 #define rs u<<1|1const int N 1e5;int n, k, c, ans; struct line {int l, r, m; // m为候车的牛的数量bool operator<(line b) {return r < b.r;} }s[N];struct tree {int l, …

antV X6的简要使用教程

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在我们的日常开发工作中&#xff0c;我们经常需要构建复杂的交互式图…

【MM32F3270火龙果】点亮led

文章目录 前言GPIO的工作模式一、有哪些工作模式&#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 二、操作GPIO点亮led2.1 初始化gpio2.2 写gpio 三、示例代码总结 前言 本文将介绍如何在MM32F3270火龙果微控制器上使用Keil开发环境点亮LED。MM32F3270火龙…

Java中使用FlatBuffers实现序列化

Java 中的 FlatBuffers有助于高速数据序列化/反序列化&#xff0c;消除解析开销。它由 Google 开发&#xff0c;为跨平台数据交换提供无模式、内存高效的解决方案。 Java 开发人员可以利用其直接内存访问来实现最佳性能和最小内存占用&#xff0c;从而提高应用程序速度、可扩展…