当前位置: 首页 > news >正文

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文件路径 视频地址&#xff1a;[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…...

LVGL简单记录

1、 vs中代码旁边有个小锁删除git 2、Visual Studio 试图编译已删除的文件&#xff0c; 如果这个文件也是你不再需要编译的文件&#xff0c;且已经从文件系统中删除&#xff0c;你需要从 .vcxproj 文件中移除或者注释掉这一行&#xff0c;以停止Visual Studio尝试去编译一个不…...

计算机网络——ARP协议

前言 本博客是博主用于复习计算机网络的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结&#xff0c;讲的非常好。 可以先去看一篇视频&#xff0c;再来参考这篇笔记&#xff08;或者说直接偷走&#xff09;。 …...

【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…...

深入理解计算机网络分层结构

一、 为什么要分层&#xff1f; 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次&#xff0c;每个层次负责特定的功能。这样做有以下几个好处&#xff1a; 模块化设计&#xff1a;每个层次都有清晰定义的功能和接口&#xff0c;使得网络系统更易于设…...

亚马逊云科技CTO带你学习云计算降本增效秘诀

2023亚马逊云科技一年一度的重磅春晚--Re:invent上有诸多不同话题的主题Keynote&#xff0c;这次小李哥带大家复盘来自亚马逊CTO: Wener博士的主题演讲: 云架构节俭之道1️⃣节俭对于云计算为什么重要&#xff1f; ▶️企业基础设施投入大&#xff0c;利用好降本策略可以减少巨…...

快速上手Vue

目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面&#xff1a;基于数据渲染出用户看到的页面 渐进式&#xff1a;Vue相关生态&#xff1a;声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…...

java 目录整理

Java知识相关目录主要参考黑马程序员 风清扬老师的视屏,参考链接为 Java_黑马刘意(风清扬)2019最新版_Java入门视频_Java入门_Java编程_Java入门教程_黑马教程_黑马程序员_idea版_哔哩哔哩_bilibili 1、java 基础 java基本认识?java跨平台原理?jdk、jre、jvm的联系? 链接:…...

使用Python的Pillow库进行图像处理书法参赛作品

介绍&#xff1a; 在计算机视觉和图像处理领域&#xff0c;Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具&#xff0c;使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件&#xff0c;并对选中的图像进行调整和…...

docker 容器指定utf-8编码

在运行 Docker 容器的时候&#xff0c;如果容器内应用需要使用 UTF-8 编码来正常处理中文&#xff0c;你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如&#xff0c;设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8&#xff1a…...

单例模式以及常见的两种实现模式

单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”&#xff0c;按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例&#xff0c;如果创建出了多个实例&#xff0c;就会编译报错。而不会创建出多个实…...

Java hashCode() 和 equals()的若干问题解答

Java hashCode() 和 equals()的若干问题解答 本章的内容主要解决下面几个问题&#xff1a; 1 equals() 的作用是什么&#xff1f; 2 equals() 与 的区别是什么&#xff1f; 3 hashCode() 的作用是什么&#xff1f; 4 hashCode() 和 equals() 之间有什么联系&#xff1f; …...

高级IO——React服务器简单实现

3.4Reactor服务器实现 1.connect封装 ​ 每一个连接都要有一个文件描述符和输入输出缓冲区&#xff0c;还有读、写、异常处理的回调方法&#xff1b; ​ 还包括指向服务器的回指指针&#xff1b; class connection; class tcpserver;using func_t std::function<void(s…...

Qt使用插件QPluginLoader 机制开发

简介&#xff1a; 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。 Qt 提供了2种APIs来创建插件&#xff1a; 一种高级API&#xff0c;用于为Qt本身编写插件&#xff1a;自定义数据库驱动程序&#xff0c;图像格…...

双子座 Gemini1.5和谷歌的本质

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

二百三十、MySQL——MySQL表的索引

1 目的 梳理一下目前MySQL维度表的索引情况&#xff0c;当然网上也有其他博客专门讲MySQL索引的&#xff0c;我这边只是梳理一下目前的索引状况而已 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语言

主要记忆&#xff1a;表、索引、视图操作语句&#xff1b;数据操作&#xff1b;通配符、转义符&#xff1b;授权&#xff1b;存储过程&#xff1b;触发器 这部分等等整理一下: “”" 1、 数据定义语言。 SQL DDL提供定义关系模式和视图、 删除关系和视图、 修改关系模式的…...

基于顺序表实现通讯录

上篇我们讲了顺序表是什么&#xff0c;和如何实现顺序表。这篇文章我们将基于顺序表来实现通讯录。 文章目录 前言一、基于顺序表是如何实现的二、通讯录的头文件和实现文件三、通讯录的实现3.1 定义通讯录结构3.2 初始化通讯录3.3 销毁通讯录3.4 通讯录添加数据3.5 查找联系人…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...