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')

免责声明

  • 本爬虫仅用于收集特定网站的信息,目的是进行数据分析,不得用于非法目的或侵犯他人隐私。对于因使用本爬虫造成的任何损失或法律责任,本人概不负责。

  • 本爬虫的数据可能存在不准确、不完整或不可用的情况,对于用户或第三方可能因此造成的任何损失,本人概不负责。

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

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

相关文章

达梦数据库非空约束错误解决,明明插入空字符串,但还是触发非空约束

1、今天在做增删改查的时候&#xff0c;发现一个问题&#xff0c;就是我的某字段设置为NOT NULL非空约束&#xff0c;但在插入空字符串的时候还是触发非空约束报错&#xff0c;这令我十分费解&#xff0c;我又没有传null&#xff0c;为什么还会触发非空约束呢&#xff1f;苦思良…

CPU和GPU分别是什么?主要区别是什么?

CPU与GPU的区别 定义性能特点应用领域结构与体积控制与协同工作特殊用途与限制脑图 定义 CPU: 中央处理器&#xff0c;负责解释并执行指令GPU: 图形处理器&#xff0c;专用于图形和视频处理 性能特点 CPU 计算量小&#xff0c;适合复杂运算结构组成复杂&#xff0c;控制逻辑…

老王讲IT:高级变量类型

IT老王&#xff1a;高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型&#xff08;float&#xff09; 布尔型&#xff08;bool&#xff09; 真 True 非 0 数 —— 非零…

一文了解ERC404协议

一、ERC404基础讲解 1、什么是ERC404协议 ERC404协议是一种实验性的、混合的ERC20/ERC721实现的&#xff0c;具有原生流动性和碎片化的协议。即该协议可让NFT像代币一样进行拆分交易。是一个图币的互换协议。具有原生流动性和碎片化的协议。 这意味着通过 ERC404 协议&#xf…

python--正则表达式-分组,贪婪模式,懒惰模式

分组&#xff1a; 分组在正则表达式中充当二次筛选 re.match(r"<[a-zA-Z].*>(.*)</[a-zA-Z]>", "<a>这个是百度的链接</a>") <re.Match object; span(0, 15), match<a>这个是百度的链接</a>> 贪婪与懒惰模式&am…

Request 读取窗体变量四种方式

1.读取窗体变量四种方式&#xff1a; (1).使用Request.Form属性读取窗体变量 (2).使用Request.QueryString属性读取窗体变量 (3).使用Request.Params属性读取窗体变量 (4).通过服务器控件的属性直接读取窗体变量 &#xff08;1&#xff09;.使用Request.Form属性读取窗体变量…

这个40M的小工具助你在windows下处理数据如虎添翼!!

这个40M的小工具助你在windows下处理数据如虎添翼&#xff01;&#xff01;7 使用windows系统时&#xff0c;如何获取一个大小为1M的文件的行数呢&#xff1f;一般是选择用excel或notepad等软件打开文件&#xff0c;然后查看最后一行的行号&#xff0c;那如果是想快速获取一个…

自我介绍的HTML 页面(入门)

一.前情提要 1.主要是代码示例&#xff0c;具体内容需自己填充 2.代码后是详解 二.代码实例和解析 代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>自我介绍页面</title>…

银河麒麟操作系统基础操作

一、查看系统启动级别 在银河麒麟操作系统中查看当前的运行级别,您可以通过以下两种方法之一: 1.如果您的系统仍然使用传统的init系统: 使用runlevel命令: runlevel这将会输出两个字符,例如 N 3。其中,N 代表之前的运行级别(如果是 N,则表示没有之前的运行级别),3…

蓝桥杯——修剪灌木

题目 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌 木,让灌木的高度变为 0 厘米。爱丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开 始向左修剪灌木。直到…

OSCP靶场--Nagoya

OSCP靶场–Nagoya 考点 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.214.21 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-02 08:52 EDT Nmap scan report for 192.168.214.21 Host is up (0.38s latency).…

用Python实现输入点云索引绘制该点云法向量

import open3d as o3d# 读取pcd文件 pcd o3d.io.read_point_cloud(r"D:\PythonProjects\Codes\paper_images\back_point\voxel.pcd")# 计算法向量 pcd.estimate_normals(search_paramo3d.geometry.KDTreeSearchParamHybrid(radius0.1, max_nn30))# 选择要绘制法向量…

C#:用定时器监控定时器,实现中止定时器正在执行的任务,并重启

Windows服务中使用的比较多的是定时器&#xff0c;但这种定时任务有个比较大的毛病&#xff1a;有时会莫名其妙地停止执行&#xff08;长时间执行不完&#xff0c;假死&#xff09;&#xff0c;必须得手工重启Windows服务才能恢复正常。这个就太麻烦了。 有没有办法来实现定时…

【前端】项目Vue2升级Vue3注意事项

代码改动 前言 Vue2项目页面直接迁移到Vue3环境下,依旧2的写法,页面各种报错,尤其element-ui升级 element-plus 组件改动比较大;以下仅供参考: 1、图标 // 旧代码 <el-button type="primary" icon="el-icon-search" @click="handleQuery&…

微信h5实现上传不低于30s

实现思路&#xff1a;上传视频前校验格式以及视频秒数是否在合理范围&#xff0c;是则上传到相对应的服务器上 HTML <input type"file" id"videoInput" accept"video/*" change"checkVideoDuration"/> JS // 检验格式与市场时…

MAC苹果电脑如何使用Homebrew安装iperf3

一、打开mac终端 找到这个终端打开 二、终端输入安装Homebrew命令 Homebrew官网地址&#xff1a;https://brew.sh/ 复制这个命令粘贴到mac的终端窗口&#xff0c;然后按回车键 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/in…

引领教育变革:山海鲸可视化智慧教育方案

随着信息技术的迅猛发展&#xff0c;教育领域正迎来一场深刻的变革。山海鲸可视化智慧教育解决方案&#xff0c;以其创新的技术和丰富的应用场景&#xff0c;正成为推动教育现代化进程的重要力量。 山海鲸可视化智慧教育解决方案是一套集教学、管理、服务于一体的综合性教育系…

Vue的模块化开发初探

文章目录 Vue的模块化开发初探一 概述二 步骤2.1 下载必须模块2.2 安装Live Server插件2.3 编写代码2.4 运行结果 三 总结四 参考资料 Vue的模块化开发初探 一 概述 Vue是一个渐进式JavaScript框架&#xff0c;可以按需引入部分功能&#xff0c;而不必全量引入整个框架。 二…

【机器学习】一文掌握机器学习十大分类算法(上)。

十大分类算法 1、引言2、分类算法总结2.1 逻辑回归2.1.1 核心原理2.1.2 算法公式2.1.3 代码实例 2.2 决策树2.2.1 核心原理2.2. 代码实例 2.3 随机森林2.3.1 核心原理2.3.2 代码实例 2.4 支持向量机2.4.1 核心原理2.4.2 算法公式2.4.3 代码实例 2.5 朴素贝叶斯2.5.1 核心原理2.…

图论做题笔记:bfs

Leetcode - 433:最小基因变化 题目&#xff1a; 基因序列可以表示为一条由 8 个字符组成的字符串&#xff0c;其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化…