m3u8网页视频文件爬取与视频合成

文章目录

m3u8网页视频文件爬取与视频合成

我们经常在网络上找到的自己想要的视频素材却无法下载,并且打开控制台一看视频是通过分割成一份份的.ts文件发送过来的。

下载m3u8文件

这时我们先双击下载m3u8文件, 这是一种用于传输流媒体的文本格式文件 , 主要用于描述和组织视频流的各个部分 。 m3u8文件作为播放列表,列出了构成视频流的所有TS(Transport Stream)片段。每个片段都是视频的一部分 。简单来说有了这些列表和对应的TS文件就可以合成完整的视频了。

下载m3u8文件列表所对应的ts文件

右键复制一个.ts文件的url。发现所有ts文件的url地址的前段一致,后缀不同。这时可以通过python进行url拼接然后批量化下载。

以下是完整python代码

python 复制代码
# My Python
# 测试时间:2024/9/8 23:46
import os
import time
import requests

# 定义基本URL
base_url = 'https://vip.ffzy-play7.com/20221227/9993_9681b67b/2000k/hls/'

# 定义文件路径
file_path = r'D:\Desktop\video\mixed.m3u8'
output_dir = r'D:\Desktop\video\ts'
failed_urls_file = r'D:\Desktop\video\failed_urls.txt'

# 创建输出目录如果它不存在
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

if not os.path.exists(os.path.dirname(failed_urls_file)):
    os.makedirs(os.path.dirname(failed_urls_file))

# 读取.m3u8文件
try:
    with open(file_path, 'r', encoding='utf-8') as file:
        lines = file.readlines()
except IOError as e:
    print(f"无法打开文件 {file_path}: {e}")
    exit(1)

# 初始化计数器
counter = 1

# 定义重试次数
max_retries = 5
retry_delay = 3  # 重试间隔时间(秒)

# 准备记录未完成下载的URL
failed_urls = []

# 处理每一行
for line in lines:
    if line.endswith('.ts\n'):
        # 拼接完整的URL
        url = base_url + line.strip()

        # 构建文件名
        filename = os.path.join(output_dir, os.path.basename(url))

        retries = 0

        while retries < max_retries:
            try:
                # 下载文件
                response = requests.get(url, timeout=60)  # 设置超时时间为60秒
                response.raise_for_status()  # 检查请求是否成功

                with open(filename, 'wb') as f:
                    f.write(response.content)

                print(f'已下载第{counter}个链接: {url}')
                break  # 成功下载后退出循环
            except requests.RequestException as e:
                print(f'下载失败 (第{counter}个链接, 尝试 {retries + 1}/{max_retries}): {url}, 错误: {e}')
                retries += 1
                if retries < max_retries:
                    print(f'等待 {retry_delay} 秒后重试...')
                    time.sleep(retry_delay)
                else:
                    print(f'达到最大重试次数,放弃下载:{url}')
                    failed_urls.append(url)  # 记录失败的URL

        # 计数器递增
        counter += 1

# 将未完成下载的URL保存到文件
if failed_urls:
    with open(failed_urls_file, 'w', encoding='utf-8') as f:
        for url in failed_urls:
            f.write(url + '\n')
    print(f'未完成下载的URL已保存到 {failed_urls_file}')
    print(f'共有 {len(failed_urls)} 个链接未能成功下载。')
else:
    print('所有链接均下载成功,没有失败的URL需要记录。')

print('初次下载完成。')

# 重新下载未下载的URL
if failed_urls:
    print('开始重新下载未完成的链接...')

    # 重置计数器
    counter = 1

    for url in failed_urls:
        # 构建文件名
        filename = os.path.join(output_dir, os.path.basename(url))

        retries = 0

        while retries < max_retries:
            try:
                # 下载文件
                response = requests.get(url, timeout=60)  # 设置超时时间为60秒
                response.raise_for_status()  # 检查请求是否成功

                with open(filename, 'wb') as f:
                    f.write(response.content)

                print(f'已重新下载第{counter}个链接: {url}')
                break  # 成功下载后退出循环
            except requests.RequestException as e:
                print(f'重新下载失败 (第{counter}个链接, 尝试 {retries + 1}/{max_retries}): {url}, 错误: {e}')
                retries += 1
                if retries < max_retries:
                    print(f'等待 {retry_delay} 秒后重试...')
                    time.sleep(retry_delay)
                else:
                    print(f'达到最大重试次数,放弃重新下载:{url}')

        # 计数器递增
        counter += 1

print('所有文件下载完成。')

运行实例

下载ffmpeg

得到相应的m3u8和ts文件就可以合成视频了,这里需要用到ffmpeg进行合成。

官网链接:https://ffmpeg.org//download.html

  1. 下载(以下是Windows系统示例)
  1. 解压到相应的文件夹即可
  2. 配置环境变量
  3. ffmpeg -version 检验是否配置成功
  4. 将m3u8文件和相对应的ts文件放在同一个文件夹下,打开命令行输入指令合成视频
bash 复制代码
ffmpeg -i ./mixed.m3u8 "test.mp4"
  1. 合成完毕
相关推荐
水兵没月4 分钟前
钉钉群机器人设置——python版本
python·机器人·钉钉
我想学LINUX1 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
数据小爬虫@4 小时前
深入解析:使用 Python 爬虫获取苏宁商品详情
开发语言·爬虫·python
健胃消食片片片片4 小时前
Python爬虫技术:高效数据收集与深度挖掘
开发语言·爬虫·python
ℳ₯㎕ddzོꦿ࿐7 小时前
解决Python 在 Flask 开发模式下定时任务启动两次的问题
开发语言·python·flask
CodeClimb7 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
一水鉴天7 小时前
为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约
开发语言·人工智能·python
Channing Lewis7 小时前
什么是 Flask 的蓝图(Blueprint)
后端·python·flask
B站计算机毕业设计超人7 小时前
计算机毕业设计hadoop+spark股票基金推荐系统 股票基金预测系统 股票基金可视化系统 股票基金数据分析 股票基金大数据 股票基金爬虫
大数据·hadoop·python·spark·课程设计·数据可视化·推荐算法
觅远8 小时前
python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传
python·自动化