首页 > 其他分享 >m3u8视频爬取处理流程分析

m3u8视频爬取处理流程分析

时间:2023-12-10 13:23:23浏览次数:29  
标签:__ 视频 return m3u8 url ts 爬取 file async

处理流程:

  • 下载所有.ts结尾文件

    • 下载.m3u8文件
    • 解析出内部.ts结尾链接
    • 利用协程异步请求所有.ts文件并下载保存
      import asyncio
      import os
      import aiohttp
      import requestsfrom sc.common.user_agent import get_ua
      from functools import partial,wraps
      
      m3u8_url = 'https://cdn8.tvtvgood.com/202205/05/d1c93b592b15/playlist.m3u8'
      pre_ts_url = m3u8_url.rsplit('/',1)[0]
      ts_dir = './tsLib'
      if not os.path.exists(ts_dir):
          os.mkdir(ts_dir)
      
      def async_retry(func=None, max_times=10, sleep=0.2, default=None):
          '''
          异步请求重试装饰器
      
          :param func:
          :param max_times: 默认请求重试10次
          :param sleep: 每次请求重试间隔,默认:0.2秒
          :param default: 所有请求均失败后,返回的默认值
          :return:
          '''
      
          if func is None:
              return partial(async_retry, max_times=max_times, sleep=sleep, default=default)
      
          @wraps(func)
          async def wrap_in(*args, **kwargs):
              for _ in range(max_times):
                  try:
                      return await func(*args, **kwargs)
                  except Exception as e:
                      print(f'retry {_ + 1} times, error: ', e)
                      await asyncio.sleep(sleep)
              return default
      
          return wrap_in
      
      async def gen_ua():
          loop = asyncio.get_event_loop()
          ua = await loop.run_in_executor(None, get_ua)
          return ua
      
      @async_retry(max_times=10, sleep=0.1)
      async def fetch(ts_url):
          if ts_url.startswith('/'):
              url = f'{pre_ts_url}{ts_url}'
              ts_url = ts_url.lstrip('/')
          else:
              url = f'{pre_ts_url}/{ts_url}'
          async with aiohttp.ClientSession() as sess:
              headers = {
                  'user-agent': await gen_ua()
              }
              async with await sess.get(url=url, headers=headers) as res:
                  context = await res.read()
                  dic_data = {
                      'ctx': context,
                      'ts_url': ts_url
                  }
                  return dic_data
      
      def download(t):
          dic_data = t.result()
          title = dic_data['ts_url']
          context = dic_data['ctx']
          with open(f'{ts_dir}/{title}', 'wb') as f:
              f.write(context)
          print(f'已下载{title}')
      
      def get_tasks():
          headers = {
              'origin': 'https://php.playerla.com',
              'referer': 'https://php.playerla.com/',
              'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',
          }
      
          params = {
              'token': 'kaPRmnMBXJbKz9ZfM9_Zgg',
              'expires': '1702128062',
          }
          response = requests.get(m3u8_url, params=params, headers=headers)
          ts_list = [line for line in response.text.splitlines() if line.endswith('.ts')]
          tasks = []
      
          for ts_url in ts_list:
              task = asyncio.ensure_future(fetch(ts_url))
              task.add_done_callback(download)
              tasks.append(task)
          return tasks
      
      if __name__ == '__main__':
          tasks = get_tasks()
          loop = asyncio.get_event_loop()
          loop.run_until_complete(asyncio.wait(tasks))
  • 利用FFmpeg对.ts文件进行合并

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import os
    import subprocess
    def merge_ts_files(input_folder, output_file):
        # 获取输入文件夹中的所有TS文件
        ts_files = [f for f in os.listdir(input_folder) if f.endswith('.ts')]
    
        # 生成一个包含所有TS文件路径的文本文件
        with open('file_list.txt', 'w') as f:
            for ts_file in ts_files:
                f.write(f"file '{os.path.join(input_folder, ts_file)}'\n")
    
        # 使用ffmpeg执行合并命令
        subprocess.call(['ffmpeg', '-f', 'concat', '-safe', '0', '-i', 'file_list.txt', '-c', 'copy', output_file])
    
        # 删除临时文件
        os.remove('file_list.txt')
    
    
    if __name__ == '__main__':
        input_folder = './tsLib'  # 替换为实际的输入文件夹路径
        output_file = './output.mp4'  # 替换为实际的输出文件路径
        merge_ts_files(input_folder, output_file)
  • FFmpeg工具

    • 官网下载对应系统版本工具:http://ffmpeg.org/download.html#build
    • 配置系统环境变量
    • 验证:ffmpeg -version

标签:__,视频,return,m3u8,url,ts,爬取,file,async
From: https://www.cnblogs.com/eliwang/p/17892530.html

相关文章

  • ts视频文件批量下载与合并
    importrequestsimportosimporttime#定义下载函数defdownload_resource(url,filename):#设置最大重试次数max_retries=3retries=0whileretries<max_retries:try:response=requests.get(url)ifrespo......
  • 【Python爬虫案例】抖音下载视频+X-Bogus参数JS逆向分析
    接口分析获取接口地址选择自己感兴趣的抖音博主,本次以“经典老歌【车载U盘】”为例每次请求的页面会有很多接口,需要对接口进行筛选:第一步筛选XHR筛选第二步筛选URL中带有post通过筛选play_add值找到视频的地址分析请求头通过对比两次请求发现只有X-Bogus数值会有变化,m......
  • 视频直播app源码,在开发时配置 lint 风格检查与修正
    在开发视频直播app源码时引入工具辅助,可以强制性地实现编码书写和提交过程中的lint校验。下面以当前流行的GitHook方案举例供参考。一、开发编辑器及lint工具配置我们在视频直播app源码中配置TSLint插件以校验typeScript;配置styleLint插件以校验CSS/LESS。我们约定......
  • b站鹏哥第二期视频
    \\终于听完了,可惜只做了后半部分笔记,不过大部分内容往后还是会讲,还在初识C语言而已  转义字符(转变原来的意思)如\n—— 换行\t——水平制表符(即Tab等于四个空格)\\——用于表示一个反斜杠,防止它被解释为一个转义序列符printf("c:\text\32\text.c");结果是c:   e......
  • 老年姐姐音视频娱乐打赏企业个人公众号小程序开源版开发
    老年姐姐音视频娱乐打赏企业个人公众号小程序开源版开发老年姐姐音视频娱乐打赏企业个人公众号小程序是一款专为老年人设计的音视频娱乐平台。以下是该平台的一些功能介绍:视频直播:提供各类老年人感兴趣的直播内容,包括健身操、养生知识、音乐演奏等,用户可以观看直播并与其他观众互动......
  • 爬取贝壳网上的租房信息
    首先说一下文件用到的库:time:提供了与时间相关的功能,如延时等。random:提供了生成随机数的功能,如生成随机整数、随机选择等。 requests:用于发送HTTP请求,可以用来获取网页内容。pandas:是一个数据处理和分析库,提供了高效的数据结构和数据分析工具,可以方便地对数据......
  • 电子眼+无人机构建平安城市视频防控监控方案
    电子眼(也称为监控摄像机)可以通过安装在城市的不同角落,实时监控城市的各个地方。它们可以用于监测交通违法行为、监控公共场所的安全以及实时监测特定区域的活动情况。通过电子眼的应用,可以帮助警方及时发现并响应各类安全事件。无人机可以在城市中进行低空飞行,具有灵活性和便携......
  • 无人机高空巡查+智能视频监控技术,打造森林防火智慧方案
    随着冬季的到来,森林防火的警钟再次敲响,由于森林面积广袤,地形复杂,且人员稀少,一旦发生火灾,人员无法及时发现,稍有疏忽就会酿成不可挽救的大祸。无人机高空巡查+智能视频监控是一种非常有效的森林防火智慧方案。通过结合无人机技术和智能视频监控系统,可以实现对森林进行全面、及时的监......
  • java使用Ffmpeg合成音频和视频
    1、Maven依赖<!--需要注意,javacv主要是一组API为主,还需要加入对应的实现--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.6</version>&......
  • GB28181视频平台LiteCVR接入音频无声的原因排查
    视频监控系统逐渐向着互联互通和可视化的方向发展。随着互联网技术的发展,视频监控系统可以联网进行数据传输,实现不同监控设备之间的互联互通。同时,可视化技术的应用也使得视频监控数据可以以更加直观的方式呈现,使得人们更加容易理解和应用。GB28181视频平台LiteCVR拓展性强,视频......