Scrapy 爬取m3u8视频
Scrapy 爬取m3u8视频
【一】效果展示
- 爬取ts文件样式
- 合成的MP4文件
【二】分析m3u8文件路径
- 视频地址:
[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html)
【1】找到m3u8文件
- 这里任务目标很明确
- 就是找m3u8文件
- 打开浏览器
- 进入开发者模式F12
- 搜索m3u8文件
- 查看响应内容含有ts文件的m3u8文件
- 再次查看标头地址即可
【2】分析m3u8路径
https://leshiyuncdn.36s.top/20240121/0RS6t7a1/2000kb/hls/index.m3u8
- 按照/拆分:leshiyuncdn.36s.top----20240121----0RS6t7a1----2000kb----hls
- 笨办法:一个个的进行搜索
- 查看哪个找到m3u8的路径
- 其中搜索
leshiyuncdn.36s.top
这个的时候- 查看响应中含有m3u8地址
- 那么就继续分析这个地址
https://bfnb1sx.phvod.top/?url=O0O0OlHnRp0hcpHM6Ly9sZXNoO0O0OXl1bmNkbi4zNnMuo000oG9wLzIwMjQwMTIxLzBSUzZ0N2ExL2luZGV4Lm0zo000oTgoo00o&next=//www.physkan.com/ph/175552-8-4.html
- 同样的采用笨方法:拆分一个一个的找
- 在搜索
O0O0OlHnRp0hcpHM6Ly9sZXNoO0O0OXl1bmNkbi4zNnMuo000oG9wLzIwMjQwMTIxLzBSUzZ0N2ExL2luZGV4Lm0zo000oTgoo00o
的时候- 找到
https://www.physkan.com/ph/175552-8-3.html
里面含有我们搜索的内容 - 并且这个地址就是浏览器的访问视频的地址
- 好了,就是它了
- 找到
【三】scrapy代码
【1】基础内容
class M3U8Spider(scrapy.Spider):# 爬虫文件名name = "m3u8"# 可访问的域名列表allowed_domains = ["www.physkan.com", 'bfnb1sx.phvod.top', 'leshiyuncdn.36s.top', 'tscdn.hyz1.top']# 起始地址start_urls = ["https://www.physkan.com/ph/175552-8-3.html"]# 视频存储路径video_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'video')# 确保文件创建好os.makedirs(video_path, exist_ok=True)# m3u8文件路径m3u8_path = os.path.join(video_path, 'index.m3u8')# ts文件路径ts_info_path = os.path.join(video_path, 'ts.txt')
【2】分析获取m3u8路径
- 我们需要的数据发现在script的player_aaaa中
- 正则匹配,json格式转换为字典格式,方便读取数据
- 其中url含有我们需要的路径参数,但是不全
- 所以补全路径发起请求
def parse(self, response):# 获取网页源码page_source = response.text# 分析源码可以发现需要的地址在script的player_aaaa中# 通过正则匹配获取pattern = r'var player_aaaa=({.*?})</script>'url_info_str = re.findall(pattern, page_source, re.DOTALL)[0]# json格式转换为字典,方便拿数据url_info_dict = json.loads(url_info_str)# 拼接m3u8路径m3u8_info_url = 'https://bfnb1sx.phvod.top/?url=' + url_info_dict['url']yield scrapy.Request(url=m3u8_info_url, callback=self.get_m3u8_url)
- 这个地址还并非是直接的m3u8路径
- 同样的获取m3u8路径参数
- 拼接完整路径参数,就可以得到m3u8的真正路径
def get_m3u8_url(self, response):page_source = response.textpattern = r'var config = ({.*?})'m3u8_info_str = re.findall(pattern, page_source, re.DOTALL)[0]m3u8_info_dict = json.loads(m3u8_info_str)m3u8_url = m3u8_info_dict['url']m3u8_url = m3u8_url.rsplit('/', 1)[0] + '/2000kb/hls/index.m3u8'yield scrapy.Request(url=m3u8_url, callback=self.get_ts_list)
【3】获取过滤ts
- 通过上面的地址获取到了index.m3u8文件
- 先保存在本地一份,方便查看
- 使用正则表达式过滤出ts视频
- 还要保存一份ts文件路径在本地
- 因为接下来使用ffmpeg工具进行视频合成
- 格式要求:
file '视频路径.ts'
- 最后异步发起ts视频文件请求
def get_ts_list(self, response):# 获取页面txt信息page_source = response.text# 保存在index.m3u8文件在本地with open(self.m3u8_path, mode='wt', encoding='utf8') as fp:fp.write(page_source)# 使用正则过滤拿出ts路径ts_urls = re.findall(r'https://tscdn.hyz1.top/[^\s]+.ts', page_source)# 保存的ts视频文件需要按照合成视频ffmpeg的格式拼接with open(self.ts_info_path, mode='wt', encoding='utf8') as fp:for ts in ts_urls:file_name = ts.rsplit('/', 1)[-1]file_path = os.path.join(self.video_path, file_name)# 保存ts文件,保存的为ts文件路径fp.write(f"file '{file_path}'" + '\n')# 异步发起ts视频文件的请求yield scrapy.Request(url=ts, callback=self.save_ts_file, meta={'file_path': file_path})
(3.1)小插曲
- 在m3u8文件中
- 你会发现这个不一样的地址
- 其实这部分是广告,可以过滤掉
【4】保存ts文件、合成MP4文件
- 首先进行ts文件保存
- 这个没有什么好说的
- 直接保存吧
def save_ts_file(self, response):# 保存ts文件本地file_path = response.meta.get('file_path')with open(file_path, mode='wb') as fp:fp.write(response.body)# 输出日志写不写都行self.log(f'保存成功:>>>{file_path.rsplit("/", 1)[-1]}')
-
拼接ts文件为MP4视频文件
-
需要用的工具是ffmpeg
-
官网:Download FFmpeg
-
去安装配置好环境变量即可
-
-
合成MP4视频
- 首先使用os模块切换到保存的ts文件路径下
- 然后执行ffmpeg命令
- ffmpeg -f concat -safe 0 -i ts.txt -c copy output.mp4
- ts.txt是之前的保存的ts文件路径文件
- 格式要求:
file '视频路径.ts'
- 格式要求:
- output.mp4是合成后的mp4文件
- 可自定义文件名等
def close(spider, reason):# 爬虫执行完毕以后,拼接视频 工具:ffmpegos.chdir(f'{spider.video_path}')os.system(f'ffmpeg -f concat -safe 0 -i ts.txt -c copy output.mp4')
免责声明
-
本爬虫仅用于收集特定网站的信息,目的是进行数据分析,不得用于非法目的或侵犯他人隐私。对于因使用本爬虫造成的任何损失或法律责任,本人概不负责。
-
本爬虫的数据可能存在不准确、不完整或不可用的情况,对于用户或第三方可能因此造成的任何损失,本人概不负责。
相关文章:
Scrapy 爬取m3u8视频
Scrapy 爬取m3u8视频 【一】效果展示 爬取ts文件样式 合成的MP4文件 【二】分析m3u8文件路径 视频地址:[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…...
LVGL简单记录
1、 vs中代码旁边有个小锁删除git 2、Visual Studio 试图编译已删除的文件, 如果这个文件也是你不再需要编译的文件,且已经从文件系统中删除,你需要从 .vcxproj 文件中移除或者注释掉这一行,以停止Visual Studio尝试去编译一个不…...
计算机网络——ARP协议
前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非常好。 可以先去看一篇视频,再来参考这篇笔记(或者说直接偷走)。 …...
【C++]C/C++的内存管理
这篇博客将会带着大家解决以下几个问题 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 1. C/C内存分布 我们先来看下面的一段代码和相关问题 int global…...
深入理解计算机网络分层结构
一、 为什么要分层? 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次,每个层次负责特定的功能。这样做有以下几个好处: 模块化设计:每个层次都有清晰定义的功能和接口,使得网络系统更易于设…...
亚马逊云科技CTO带你学习云计算降本增效秘诀
2023亚马逊云科技一年一度的重磅春晚--Re:invent上有诸多不同话题的主题Keynote,这次小李哥带大家复盘来自亚马逊CTO: Wener博士的主题演讲: 云架构节俭之道1️⃣节俭对于云计算为什么重要? ▶️企业基础设施投入大,利用好降本策略可以减少巨…...
快速上手Vue
目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面:基于数据渲染出用户看到的页面 渐进式:Vue相关生态:声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…...
java 目录整理
Java知识相关目录主要参考黑马程序员 风清扬老师的视屏,参考链接为 Java_黑马刘意(风清扬)2019最新版_Java入门视频_Java入门_Java编程_Java入门教程_黑马教程_黑马程序员_idea版_哔哩哔哩_bilibili 1、java 基础 java基本认识?java跨平台原理?jdk、jre、jvm的联系? 链接:…...
使用Python的Pillow库进行图像处理书法参赛作品
介绍: 在计算机视觉和图像处理领域,Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具,使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件,并对选中的图像进行调整和…...
docker 容器指定utf-8编码
在运行 Docker 容器的时候,如果容器内应用需要使用 UTF-8 编码来正常处理中文,你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如,设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8:…...
单例模式以及常见的两种实现模式
单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”,按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例,如果创建出了多个实例,就会编译报错。而不会创建出多个实…...
Java hashCode() 和 equals()的若干问题解答
Java hashCode() 和 equals()的若干问题解答 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equals() 之间有什么联系? …...
高级IO——React服务器简单实现
3.4Reactor服务器实现 1.connect封装 每一个连接都要有一个文件描述符和输入输出缓冲区,还有读、写、异常处理的回调方法; 还包括指向服务器的回指指针; class connection; class tcpserver;using func_t std::function<void(s…...
Qt使用插件QPluginLoader 机制开发
简介: 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。 Qt 提供了2种APIs来创建插件: 一种高级API,用于为Qt本身编写插件:自定义数据库驱动程序,图像格…...
双子座 Gemini1.5和谷歌的本质
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
二百三十、MySQL——MySQL表的索引
1 目的 梳理一下目前MySQL维度表的索引情况,当然网上也有其他博客专门讲MySQL索引的,我这边只是梳理一下目前的索引状况而已 2单列索引 2.1 索引截图 2.2 建表语句 3 联合索引 3.1 索引截图 3.2 建表语句 4 参考的优秀博客 http://t.csdnimg.cn/ZF7…...
并发编程之ThreadLocal使用及原理
ThreadLocal主要是为了解决线程安全性问题的 非线程安全举例 public class ThreadLocalDemo {// 非线程安全的private static final SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static Date parse(String strDate) throws ParseExc…...
软件测试 测试开发丨Pytest结合数据驱动-yaml,熬夜整理蚂蚁金服软件测试高级笔试题
编程语言 languages: PHPJavaPython book: Python入门: # 书籍名称 price: 55.5 author: Lily available: True repertory: 20 date: 2018-02-17 Java入门: price: 60 author: Lily available: False repertory: Null date: 2018-05-11 yaml 文件使用 查看 yaml 文件 pych…...
软考数据库---2.SQL语言
主要记忆:表、索引、视图操作语句;数据操作;通配符、转义符;授权;存储过程;触发器 这部分等等整理一下: “”" 1、 数据定义语言。 SQL DDL提供定义关系模式和视图、 删除关系和视图、 修改关系模式的…...
基于顺序表实现通讯录
上篇我们讲了顺序表是什么,和如何实现顺序表。这篇文章我们将基于顺序表来实现通讯录。 文章目录 前言一、基于顺序表是如何实现的二、通讯录的头文件和实现文件三、通讯录的实现3.1 定义通讯录结构3.2 初始化通讯录3.3 销毁通讯录3.4 通讯录添加数据3.5 查找联系人…...
咸鱼之王_手游_开服搭建架设_内购修复无bug运营版
视频演示 咸鱼之王_手游_开服 游戏管理后台界面 源码获取在文章末尾 源码获取在文章末尾 源码获取在文章末尾 或者直接下面 https://githubs.xyz/y28.html 1.安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…...
【JSON2WEB】14 基于Amis的CRUD开发30分钟速成
【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…...
Java入门教程||Java 变量
Java 变量 Java教程 - Java变量 变量由标识符,类型和可选的初始化程序定义。变量还具有范围(可见性/生存期)。 Java变量类型 在Java中,必须先声明所有变量,然后才能使用它们。变量声明的基本形式如下所示࿱…...
基于Java的校园快递一站式服务系统 (源码+文档+包运行)
一.系统概述 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本校园快递一站式服务系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞…...
通讯录的实现(顺序表版本)
我们知道通讯录是基于顺序表的前提下,要写好通讯录我们就要深入了解好顺序表。我们先来看看什么是顺序表。(注意今天代码量有点多,坚持一下)。冲啊!兄弟们! 顺序表的简单理解 对于顺序表,我们首…...
利用Sentinel解决雪崩问题(一)流量控制
1、解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待;舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离;熔断降级:由断路器统计业务…...
二叉树总结
递归返回值 1、如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。 2、如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 3、如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,…...
接口优化技巧
一、背景 针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案 二、接口优化方案总结 1.批处理 批量思想:批量操作数据库&a…...
【工具】NPS 内网穿透搭建
背景 在日常开发中经常会涉及到使用公网某个端口进行开发调试的情况,但我们日常开发的机器IP是非公网IP,所以需要使用内网穿透的手段,使我们的服务在公网上能被访问到。 常用的内网穿透工具分两大类,一类是付费/免费服务…...
【数学】主成分分析(PCA)的详细深度推导过程
本文基于Deep Learning (2017, MIT),推导过程补全了所涉及的知识及书中推导过程中跳跃和省略的部分。 blog 1 概述 现代数据集,如网络索引、高分辨率图像、气象学、实验测量等,通常包含高维特征,高纬度的数据可能不清晰、冗余&am…...
杭州投资公司自适应网站/dw网页制作教程
SpringBoot入门一 推荐: Spring Boot系列文章Spring Boot基础教程Spring Boot参考指南springboottutorial 项目属性配置 参考: Spring Boot属性配置文件详解 可以使用properties文件,YAML文件配置。YAML文件相对来说更简洁一点。 如下…...
wordpress 菜单管理系统/任何东西都能搜出来的软件
他通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。 adaboost提高那些被前一轮弱分类器错误分类样本的权重,而降低那些被正确分类样本的权重,这样使得,那些没有得到正确…...
营销型网站的特点/怎样在平台上发布信息推广
一:如果你的机器上之前安装有mysql数据库,先进行卸载 (1)需要先将它的文件删除 (2)同时注意删除老板本的etc/my.cnf文件和/etc/mysql目录,这两个文件控制的是mysql的一些配置属性。 二ÿ…...
兰州做网站公司/站点推广是什么意思
每年都有无数年轻程序员,加入软件行业。他们在学校里学过编程,但是对这个行业的现实一无所知。Patrick McKenzie 是美国一家小软件公司的老板,他写了一篇长文,介绍这个行业的一些实际情况。 原文:https://www.kalzumeu…...
wordpress列表分页 js/慧聪网seo页面优化
使用环境在cmd模式下输入 mysql --version (查看mysql安装的版本).完整的命令可以通过mysql --help来获取.本测试使用的Mysql版本是mysql5,1.连接数据库不借助数据库管理软件(如Navicat等软件),通过dos连接mysql软件库服务器,然后操作数据库.连接数据库通用格式:mysql -P 端口号…...
广饶网站建设/郑州seo关键词
1.2 发展型机器人学的定义与起源 发展型机器人学是人工智能系统(机器人)中对行为和认知能力进行自主设计的具有跨学科背景的研究方法,它的灵感直接来源于在儿童先天认知系统中观察到的发展原则和机制。发展型机器人学的主要思想是࿱…...