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.text
    pattern = 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):
        # 爬虫执行完毕以后,拼接视频  工具:ffmpeg
        os.chdir(f'{spider.video_path}')
        os.system(f'ffmpeg -f concat -safe 0 -i ts.txt -c copy output.mp4')

免责声明

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙OS开发实战:【自动化测试框架】使用指南

概述 为支撑HarmonyOS操作系统的自动化测试活动开展&#xff0c;我们提供了支持JS/TS语言的单元及UI测试框架&#xff0c;支持开发者针对应用接口进行单元测试&#xff0c;并且可基于UI操作进行UI自动化脚本的编写。 本指南重点介绍自动化测试框架的主要功能&#xff0c;同时…

基于Java+SpringBoot+Vue文学名著分享系统(源码+文档+部署+讲解)

一.系统概述 随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理…

深入探索实时音视频技术:RTC程序设计权威指南

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

BUUCTF刷题十一道(12)SSTI专题一

文章目录 学习文章[Flask]SSTI[GWCTF 2019]你的名字[第三章 web进阶]SSTI[pasecactf_2019]flask_ssti[NewStarCTF 公开赛赛道]BabySSTI_One[Dest0g3 520迎新赛]EasySSTI[NewStarCTF 公开赛赛道]BabySSTI_Two[NewStarCTF 公开赛赛道]BabySSTI_Three[GYCTF2020]FlaskApp[CSCCTF 2…

java基础语法(13)

1. final关键字 final概述 学习了继承后&#xff0c;我们知道&#xff0c;子类可以在父类的基础上改写父类内容&#xff0c;比如&#xff0c;方法重写。那么我们能不能随意的继承API中提供的类&#xff0c;改写其内容呢&#xff1f;显然这是不合适的。为了避免这种随意改写的情…

关于转义符 \ 在php正则中的匹配问题

今天做题遇到一个很经典的问题&#xff0c;记录一下&#xff0c;先看一段代码 <?php $str&#xff0c;&#xff0c;"\\"; $pattern&#xff0c;&#xff0c;"/\\/"; if(preg_match($partern,$str,$arr)) { &#xff0c;&#xff0c;&#xff0c;&…

结构型模式--1.适配器模式【托尼托尼·乔巴】

1. 翻译家 在海贼王中&#xff0c;托尼托尼乔巴&#xff08;Tony Tony Chopper&#xff09;是草帽海贼团的船医&#xff0c;它本来是一头驯鹿&#xff0c;但是误食了动物系人人果实之后可以变成人的形态。 乔巴吃了恶魔果实之后的战斗力暂且抛开不谈&#xff0c;说说它掌握的第…

金仓数据库Kingbase的数据库开发管理工具KStudio连接乱码

背景&#xff1a; 金仓数据库V8R6&#xff0c;KStudio在Windows10上运行&#xff0c;JDK8 问题&#xff1a; 使用客户端连接数据库时&#xff0c;提示信息乱码&#xff0c;首选项设置字符集不管用&#xff0c;具体如下图所示&#xff1a; Before&#xff1a; After&#xff1…

018——红外遥控模块驱动开发(基于HS0038和I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 协议 二、 驱动代码 三、 应用代码 四、 实验 五、 程序优化 一、 模块介绍 1.1 简介 红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中&#xff0c;像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统分为发送端和…

【On Hold】又一本ESCI被紧急On Hold!!年发文量激增19倍令人匪夷所思

【SciencePub学术】前几日Hindawi撤稿事件闹得沸沸扬扬&#xff0c;整个学术界的关注点都在这次的撤稿事件。所有的期刊都进入自检模式&#xff0c;官方在审核期刊资质时也颇为严格了。 但是经小编查阅资料时发现&#xff0c;最近有一本ESCI期刊又被科睿唯安官方打上了On Hold…

基于SpringBoot+Vue的“漫画之家”系统(源码+文档+部署+讲解)

一.系统概述 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理…

【Shell】循环语句基础

Shell 循环 循环语句 Shell 循环循环的定义for 循环for循环的C语言格式 while 循环until 循环 循环的定义 循环在编程中通常指循环结构。 循环结构是编程中的一种控制结构&#xff0c;它允许代码在满足特定条件时重复执行一段特定的指令集合&#xff0c;这部分重复执行的代码…

ADP-2-20+ 信号调节 20MHz-2GHzRF功分器 合路器

ADP-2-20 是一款由Mini-Circuits公司出产的功分器&#xff08;power divider&#xff09;。这款功分器的工作温度规模为-40C至85C&#xff0c;贮存温度规模为-55C至100C。作为分路器&#xff0c;它的电源输入最高可达1W&#xff0c;内部功耗最大为0.125W。假如超越这些限制&…

BFS宽度优先搜索例题(蓝桥杯)——逃跑的牛

问题描述&#xff1a; 农夫John的一头牛逃跑了&#xff0c;他想要将逃跑的牛找回来。现假设农夫John和牛的位置都在一条直线上&#xff0c;农夫John的初始位置为N&#xff08;0≤N≤100,000&#xff09;&#xff0c;牛的初始位置为K&#xff08;0≤K≤100,000&#xff09;。农夫…

人社大赛算法赛题解题思路分享+季军+三马一曹团队

团队成员介绍: 梅鵾 上海交通大学 众安科技 算法工程师 吴栋梁 复旦大学 众安科技 算法工程师 李玉娇 复旦大学 众安科技 算法工程师 一、赛题背景分析及理解 本赛题提供了部分地区2016年度的医疗保险就医结…

改进YOLOv8注意力系列七:结合空间关系增强注意力SGE、SKAttention动态尺度注意力、TripletAttention

改进YOLOv8注意力系列七:结合空间关系增强注意力SGE、SKAttention动态尺度注意力、全局上下文信息注意力Triplet Attention 代码Spatial Group Enhance (SGE)SKAttention动态尺度注意力全局上下文信息注意力Triplet Attention(无参)加入方法各种yaml加入结构本文提供了改进 Y…

openGauss 5.0 单点企业版部署_Centos7_x86(上)

背景 通过openGauss提供的脚本安装时&#xff0c;只允许在单台物理机部署一个数据库系统。如果您需要在单台物理机部署多个数据库系统&#xff0c;建议您通过命令行安装&#xff0c;不需要通过openGauss提供的安装脚本执行安装。 本文档环境&#xff1a;CentOS7.9 x86_64 4G1…

IDEA import时不使用*

在使用 IDEA 进行开发时&#xff0c;会经常使用到 import 关键字导入所需的类。 IDEA 默认设置是同包类是超过 5 个或者静态导入超过 3 个变成 import xxx.*。 但 import xxx.* 的形式会造成一些用不到的类被引入&#xff0c;导致资源浪费&#xff0c;最好还是不使用这种方式…

雷达学习之多普勒频率

一、多普勒频率如何产生&#xff1f; 雷达的原理是发射一些无线电脉冲来探测目标&#xff0c;并通过回波的延时来计算目标与雷达的距离&#xff0c;但当目标为运动物体时&#xff0c;在回波向目标传输的同时&#xff0c;目标也会远离或接近回波&#xff0c;所以会导致回波信号…

【git】checkout origin/xxx 出现 detached HEAD问题

git 检出远程分支出现Head分离的是什么原因导致的呢&#xff1f;&#xff1f; 因为Head指向了origin的一个commit, 但是这个origin分支你的本地又没有&#xff0c;也就是说你本地没有追踪这个分支&#xff0c;那就要track一下 git checkout -h 看一下有没有追踪的命令 果不其…
最新文章