Python +Pyqt5 简单视频爬取学习(一)
文章目录
前言
一、演示
二、查找网页视频流的索引文件
三、分析视频流的url和视频流索引文件的差异性
四、判断视频数据是否需要转化为ts
五、判断视频是否被加密,如若被加密,需要先解密
六、合并所有的ts视频,以MP4模式输出完整视频
总结
前言
目的:将网站上的m3u8视频下载到本地-----仅娱乐使用;
流程:
- 通过网页调试模式,获取网页视频流的索引文件;
- 分析视频流的url和视频流索引文件的差异性;
- 通过视频流的url,下载视频数据至本地;
- 判断视频数据是否需要转化为ts;
- 判断视频是否被加密,如若被加密,需要先解密;
- 合并所有的ts视频,以MP4模式输出完整视频;
一、演示

二、查找网页视频流的索引文件

F12调试模式后,找到该文件,双击后,可直接下载视频索引文件,其中存在视频片段的部分url或者完整url;
代码实现如下:
# 视频索引文件下载网址
m3u8_url = "https://v.gsuus.com/play/PdyY7qzd/index.m3u8"
# User-Agent 即用户代理,在网站中可以查询
hea = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
user_agent_list = [# 在这里可以写多个headers,然后随机选一个进行访问,这样可以防止频繁访问ip被封hea,]
headers = {'user-agent': random.choice(user_agent_list),'Connection': 'close',
}resp = requests.get(m3u8_url, headers, verify=False)
data = resp.text
print(data)
三、分析视频流的url和视频流索引文件的差异性


通过分析视频流的地址,来下载所有的片段视频
代码实现如下:
# 视频文件下载网址
url_dow = "https://gs.gszyi.com:999/hls/499/20241002/2923112/plist0.ts"# User-Agent 即用户代理,在网站中可以查询
hea = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
user_agent_list = [# 在这里可以写多个headers,然后随机选一个进行访问,这样可以防止频繁访问ip被封hea,]
headers = {'user-agent': random.choice(user_agent_list),'Connection': 'close',
}# url_dow:下载ts视频文件的url
# headers:自定义 HTTP 请求头
# timeout:请求超时时间设置
res = requests.get(url_dow, headers,timeout=20)save_path = "000.ts"
# 判断页面是否正确
if res.status_code == 200:data = res.content# 以二进制模式打开文件,写入二进制数据with open(save_path, 'wb+') as f:f.write(data)f.flush()print("视频{}下载完毕!!!".format(save_path))
四、判断视频数据是否需要转化为ts

视频为ts格式,则不需要进行转化,如若是其他格式,比如jpeg,jpg格式则需要转化为ts格式,即是重命名文件名称(用该功能函数即可实现 os.rename() )。
五、判断视频是否被加密,如若被加密,需要先解密

如若显示该key网址url,则表示视频被加密,一般所有视频都只有一个key,但也有例外,有些视频每个片段都会进行加密,目前还在研究如何解决,不过也够用了,嘿嘿。
前面下载的视频打开便会显示错误,则就是说明视频需要解密。(注意:某些情况下,可能解密后视频依然无法正常打开,造成原因可能是解密方法不对或者下载视频数据异常。)
代码实现如下:
from Crypto.Cipher import AES# 解密ts视频
def jiemi(src,dec,key):# src:要解密的文件; dec:解密后的文件; key、iv 从m3u8可见try:# 以二进制格式打开已下载的ts文件with open(src, 'rb') as f1:# 读取文件数据part = f1.read() # key密钥的长度等于IV的向量长度if len(key) == 16: IV=b'0000000000000000'elif len(key) == 32: IV=b'00000000000000000000000000000000'# 解密数据cipher = AES.new(key, AES.MODE_CBC,IV) plain_data = cipher.decrypt(part)if part:# 创建新文件with open(dec, 'wb') as f2:# 将解密后的数据写入到创建的新文件中f2.write(plain_data) print("解密成功!") except Exception as error:print(src)print("错误异常:%s" % error )print("原始异常信息:{}".format(traceback.format_exc())) # 返回异常信息# src:要解密的文件; dec:解密后的文件; key、iv 从m3u8可见src = "000.ts"dec = "111.ts"# key文件中读取key = "qG6ikBmMJpJGNulz"# 需要将key和iv转换为字节形式的数据key = bytes(key, encoding='utf-8')jiemi(src,dec,key)
实例演示:
六、合并所有的ts视频,以MP4模式输出完整视频
前置条件:
1、需要配置ffmpeg 的运行环境【可以自行下载,或者我的资源中也有安装包】;
2、下载ffmpeg 完成后,配置环境变量即可。

使用该命令合并视频:
#file_names_file:表示所有ts文件的路径
#output.mp4 输出视频名称
os.system(f'ffmpeg -f concat -safe 0 -i {file_names_file} -c copy output.mp4')
所以,合并视频之前,我们需要将file_names_file文件创造出来,否则执行合并命令会失败;
如下图所示(这里就不写代码实现了,思路就是将存放视频流的文件目录列出来,然后判断是否为视频文件,并将对应的路径写入到txt文件内即可。);

然后,我们有了这个file_names_file文件后,便可直接运行合并命令(视频流必须完整,视频流必须与文件内的视频路径对应,否则会执行失败);
代码实现如下:
import threading
def getvideo():# 3.2 大量 ts 文件file_names_file = 'video.txt'os.system(f'ffmpeg -f concat -safe 0 -i {file_names_file} -c copy output.mp4')# os.remove(file_names_file)t = threading.Thread(target=getvideo)
t.start()
t.join()
print("视频合并结束!")
总结
至此,整个流程完结,可以下载到我们需要的视频了,说实话,比在网站上看要快不少,还是比较有趣的。
并且,请求频繁会导致资源请求失败,这个也要考虑,我用的是多线程,速度很快,所以加入了获取资源失败时会重新获取资源,至少不会漏掉视频资源。
网页请求失败的话,则是表示网站拒绝你的访问,这个问题还待解决,不解决也足够使用了,反正自己使用即可。
后续完善整个工具,目前只实现单个视频下载,后续完成多个视频下载....

相关文章:
Python +Pyqt5 简单视频爬取学习(一)
文章目录 前言 一、演示 二、查找网页视频流的索引文件 三、分析视频流的url和视频流索引文件的差异性 四、判断视频数据是否需要转化为ts 五、判断视频是否被加密,如若被加密,需要先解密 六、合并所有的ts视频,以MP4模式输出完整视频 总结 前…...
Python Requests模块全面教程
Python Requests模块全面教程 在现代软件开发中,网络请求是一个不可或缺的部分。无论是获取网页数据、调用API接口,还是进行数据交互,都会涉及到HTTP请求。Python的Requests模块是一个非常强大的库,能够让我们轻松地发送HTTP请求…...
PyQt入门指南六十 与Python其他库的集成方法
PyQt是一个强大的GUI库,它可以与Python的其他库无缝集成,以实现更复杂的功能。以下是一些常见的集成方法和示例: 1. NumPy NumPy是Python中用于科学计算的基础库。您可以在PyQt应用程序中使用NumPy来处理数据和进行数值计算。 import sys …...
Android15之解决:Dex checksum does not match for dex:framework.jar问题(二百三十九)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
车企自动驾驶功能策略 --- 硬件预埋(卷传感器配置)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
【已为网站上传证书,却显示不安全】
已为网站上传证书,却显示不安全 错误显示解决办法分析原因 错误显示 此站点有一个由受信任的颁发机构颁发的有效证书但是网站的某些部分不安全 解决办法 删除浏览器所有历史记录, 如果是Edge浏览器显示不安全,那就删除Edge浏览器的所有历史记录; 如果是Google Chrome浏览器显…...
docker busybox作为initContainers
一、上传到私有仓储 docker pull busybox:1.33.1 docker tag busybox:1.33.1 192.168.31.185/public/busybox:1.33.1 docker push 192.168.31.185/public/busybox:1.33.1 --- apiVersion: apps/v1 kind: Deployment metadata:annotations: {}labels: {}name: saas-ali-apiname…...
20.UE5UI预构造,开始菜单
2-22 开始菜单、事件分发器、UI预构造_哔哩哔哩_bilibili 目录 1.UI预构造 2.开始菜单和开始关卡 2.1开始菜单 2.2开始关卡 2.3将开始菜单展示到开始关卡 3.事件分发器 1.UI预构造 如果我们直接再画布上设计我们的按钮,我们需要为每一个按钮进行编辑&#x…...
Electron教程1-初学入门
玩转Electron Electron 是什么注意事项环境安装安装 vscode安装 git 第一个实例第二个实例第二个实例解读 总结问题解答 Electron 是什么 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个…...
从北美火到中国,大数据洞察品牌“STANLEY”的突围之路
保守直筒大头的“硬汉”外形,以百变颜色踩中时尚命脉,与各路大牌“梦幻联动”,不少时尚弄潮儿没能逃过其“真香”诱惑。 这就是今年以来从北美火到中国的STANLEY,在“巨无霸”水杯中突围出属于自己的一条路。 最近STANLEY又整活…...
深度学习之GAN应用
1 GAN的应用(文本生成) 1.1 GAN为什么不适合文本任务? GAN在2014年被提出之后,在图像生成领域取得了广泛的研究应用。然后在文本领域却一直没有很惊艳的效果。主要在于文本数据是离散数据,而GAN在应用于离散数据时…...
鸿蒙生态下的安全隐私保护:打造用户信任的应用体验
鸿蒙生态下的安全隐私保护:打造用户信任的应用体验 随着华为鸿蒙系统的快速发展,越来越多的设备开始支持这一操作系统,不仅限于智能手机,还包括智能穿戴设备、智能家居产品等。作为开发者,在享受鸿蒙生态系统带来的广…...
用pandoc工具实现ipynb,md,word,pdf之间的转化
Pandoc 是一个强大的工具,可以实现多种文件格式之间的转换,包括 Jupyter Notebook (.ipynb)、Markdown (.md)、Word (.docx)、PDF 等格式。以下是具体的实现方法: 1. 安装 Pandoc 确保已安装 Pandoc: Linux: sudo apt install p…...
第三十一天|贪心算法| 56. 合并区间,738.单调递增的数字 , 968.监控二叉树
目录 56. 合并区间 方法1:fff 看方法2:fff优化版 方法3: 738.单调递增的数字 968.监控二叉树(贪心二叉树) 56. 合并区间 判断重叠区间问题,与452和435是一个套路 方法1:fff 看方法2&am…...
力扣 最长公共前缀-14
最长公共前缀-14 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//定义一个字符数组,用于存储strs字符串数组第一个字符串,方便与后面的字符串进行比较判断char s[200];//定义一个字符数组,用来返回…...
IDEA调整警告级别【IntelliJ IDEA 2024.2.0.1】
文章目录 目前现状鼠标悬停,选择配置筛选 > 取消选择OK效果 目前现状 需要把提示改成只要显示error的5个 鼠标悬停,选择配置 筛选 > 取消选择 OK 效果...
Vulnhub靶场 Billu_b0x 练习
目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 文件包含2. SQL注入3. 文件上传4. 反弹shell5. 提权(思路1:ssh)6. 提权(思路2:内核)7. 补充 0x04 总结 0x00 准备 下载链接&#…...
Essential Cell Biology--Fifth Edition--Chapter one (6)
1.1.4.4 Internal Membranes Create Intracellular Compartments with Different Functions [细胞膜形成具有不同功能的细胞内隔室] 细胞核、线粒体和叶绿体并不是真核细胞中唯一的膜包围细胞器。细胞质中含有大量的[ a profusion of]其他细胞器,这些细胞器被单层膜…...
Jupyter Book 快捷键总结大全
快捷键完整分类与功能 1. 模式切换 在 jb 中,您可以通过快捷键快速切换编辑模式和命令模式: 快捷键功能Esc切换到命令模式Enter切换到编辑模式 2. 单元格操作 单元格是 jb 的基本操作单位,以下快捷键可以帮助您快速编辑和管理单元格&…...
Spring Authorization Server OAuth2.1
Spring Authorization Server介绍 Spring Authorization Server 是一个框架,它提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。 它建立在 Spring Security 之上,为构建 OpenID Connect 1.0 身份提供者和 OAuth2 授权服务器产品提供…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

