news 2026/5/16 14:13:31

Python 爬虫进阶技巧:爬取视频资源分片合并完整教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 爬虫进阶技巧:爬取视频资源分片合并完整教程

前言

当下主流视频平台为降低服务器带宽压力、实现流畅在线播放、强化资源防盗链防护,普遍摒弃完整单一视频源分发模式,转而采用流媒体分片传输机制进行资源分发。网页端播放的长视频、影视剧、课程视频、短视频合集等资源,均会被切割为数量不等的 TS、m4s、flv 等格式小分片文件,搭配 m3u8 索引文件完成顺序播放。

普通爬虫仅能完成网页源码抓取,无法直接获取完整视频文件,若逐个下载分片文件再手动排序合并,不仅操作繁琐、效率低下,还极易出现分片顺序错乱、音画不同步、格式损坏等问题。依托 Python 语言实现自动化抓取 m3u8 索引链接、批量下载全部视频分片、自动排序校验、无损合并封装为通用 MP4 格式视频,已经成为视频资源爬虫开发的核心刚需。

本文整合流媒体爬虫全流程开发逻辑,覆盖索引解析、分片高速下载、异常补下、格式转码、批量合并等核心实操内容,配套开发所需依赖库官方访问链接统一放置于前文,开发者可直接跳转完成查阅与环境部署:

  1. requests 网络请求库
  2. lxml 网页与接口数据解析库
  3. ffmpeg 音视频编解码工具
  4. threading Python 内置多线程库
  5. os 本地文件路径管理库

全文基于 Python3.8 及以上稳定版本编写,适配 Windows、Linux、服务器端全运行环境,所有实战代码经过场景实测可直接部署运行,兼顾单机本地采集与服务器无人值守批量视频爬取场景,同时融入大量行业实战避坑规则,助力开发者搭建标准化流媒体视频采集体系。

一、流媒体分片视频核心原理与结构解析

1.1 m3u8 流媒体协议基础定义

m3u8 是基于 HTTP 协议的流媒体播放列表文件,本质为纯文本格式索引文件,内部记录着所有视频分片的网络访问地址、分片时长、加密密钥、播放顺序等核心信息,是实现分片视频爬取合并的核心入口文件。

用户在网页点击播放视频时,播放器首先加载 m3u8 索引文件,按照文件内记录的顺序依次请求加载每一个视频分片,全部分片加载完成后无缝拼接播放,以此实现长视频流畅播放效果,同时大幅度降低单次资源请求体积,规避完整大文件传输卡顿问题。

1.2 主流视频分片格式区分

目前网络流媒体场景中使用率最高的三类分片格式特性与适配场景如下表所示:

表格

分片格式后缀标识存储内容合并难度主流使用平台
TS 分片.ts整合视频画面与音频数据低,直接无损合并短视频平台、影视站点、公开课平台
m4s 分片.m4s视频轨、音频轨分离存储高,需分别合并再封装主流长视频平台、主流移动端视频站点
FLV 分片.flv老式流媒体封装格式中,需格式转码处理老式视频网站、怀旧资源站点

1.3 加密与非加密分片核心区别

  1. 明文非加密分片:m3u8 文件内直接写明完整分片 URL 地址,无额外密钥校验,下载之后可直接按照顺序拼接合并,开发难度最低,是新手入门首选实战场景。
  2. AES 加密分片:分片文件经过对称加密处理,m3u8 文件中会标注密钥获取地址与加密偏移量,必须先下载解密密钥,在合并过程中完成解密操作,否则合并后的视频无法正常播放,画面黑屏、音频失效。
  3. 私有协议加密分片:平台自主研发加密规则,密钥动态时效更新,IP 绑定校验严格,普通爬虫难以完成解密采集,属于高难度反爬流媒体资源。

1.4 视频爬虫分片采集完整流程

标准化分片视频爬取合并流程固定不变,所有开发逻辑均围绕该流程搭建:

  1. 模拟浏览器访问视频播放页面,抓包抓取真实有效的 m3u8 索引链接;
  2. 发起网络请求读取 m3u8 文本内容,过滤注释信息,提取全部视频分片真实地址;
  3. 本地创建专属文件夹,分类存储所有下载完成的视频分片文件;
  4. 采用单线程或多线程模式批量下载分片资源,记录下载失败分片并自动重试;
  5. 按照 m3u8 内部定义的播放顺序完成分片排序,杜绝画面错乱;
  6. 调用专业音视频处理工具完成分片无损合并,封装为通用 MP4 格式;
  7. 清理本地无用分片缓存文件,完成整个视频采集闭环流程。

二、环境部署:FFmpeg 工具安装与环境配置

视频分片无法依靠 Python 原生代码直接完成高质量合并转码,行业内统一使用FFmpeg开源音视频处理工具实现合并、解密、格式封装,该工具跨平台免费开源,是视频爬虫开发必备核心环境。

2.1 Windows 系统部署流程

  1. 进入 FFmpeg 官方网站下载对应系统压缩安装包,解压至电脑无中文、无空格路径目录;
  2. 找到解压目录内 bin 文件夹,将该文件夹路径添加至系统全局环境变量;
  3. 打开系统命令行窗口,输入ffmpeg -version,输出版本信息即代表配置生效。

2.2 Linux 服务器部署流程

直接执行系统一键安装命令即可快速完成部署,无需手动配置环境变量:

plaintext

yum install ffmpeg -y

安装完成后同样使用版本查询命令校验可用性。

2.3 基础常用合并命令说明

在正式编写 Python 代码调用之前,掌握原生 FFmpeg 核心合并命令,能够更加清晰理解代码底层执行逻辑:

  1. 有序 TS 分片快速合并命令:ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
  2. 单个分片直接转码封装命令:ffmpeg -i test.ts test.mp4
  3. 加密分片解密合并命令:搭配密钥文件完成解码后再执行合并操作。

三、Python 解析 m3u8 索引文件提取分片链接

3.1 m3u8 文件内容过滤规则

标准 m3u8 文件内部包含大量#开头的注释标签、时长标记、版本标记等无效内容,仅带有网络地址、相对路径的行为有效分片地址,代码解析过程中需要直接过滤所有注释行,仅保留资源访问路径。

3.2 索引链接解析实战代码

python

运行

import requests # 配置全局请求头,模拟浏览器规避基础反爬 HEADERS = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36" } def parse_m3u8(m3u8_url): """ 解析m3u8索引文件,提取所有视频分片地址 :param m3u8_url: 抓包获取的m3u8真实链接 :return: 有序分片地址列表 """ try: res = requests.get(url=m3u8_url,headers=HEADERS,timeout=15) res.encoding = "utf-8" content = res.text # 按行分割文本内容 line_list = content.splitlines() ts_url_list = [] for line in line_list: # 过滤注释行、空行,筛选分片地址 if not line.startswith("#") and line.strip() != "": # 自动拼接相对路径,补全完整网络地址 if line.startswith("http"): ts_url_list.append(line) else: base_url = m3u8_url.rsplit("/",1)[0] full_ts_url = base_url + "/" + line ts_url_list.append(full_ts_url) print(f"成功解析视频分片总数:{len(ts_url_list)}") return ts_url_list except Exception as e: print(f"m3u8索引解析失败:{str(e)}") return [] if __name__ == "__main__": # 填入抓包获取的真实m3u8链接 m3u8_link = "填入实际抓取的索引地址" ts_all_list = parse_m3u8(m3u8_link)

3.3 代码核心原理

  1. 通过网络请求直接读取 m3u8 纯文本内容,利用分行切割完成内容拆分;
  2. 精准过滤所有以井号开头的流媒体标记信息,只保留有效资源路径;
  3. 自动区分绝对地址与相对地址,完成路径拼接补全,避免出现 404 访问错误;
  4. 最终返回严格遵循播放顺序的分片地址列表,为后续批量下载提供有序数据源。

四、多线程批量下载视频分片文件

单线程依次下载分片文件速度缓慢,面对数百上千个分片资源采集效率极低,借助 Python 多线程技术可同时发起多个下载任务,大幅度提升分片资源整体下载速度,同时加入文件查重机制,避免重复下载浪费网络资源。

4.1 分片批量下载完整代码

python

运行

import os import requests import threading HEADERS = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36" } # 设置同时下载线程数量,根据自身网络带宽合理调整 THREAD_NUM = 10 def create_save_dir(video_name): """创建视频专属分片存储文件夹""" save_path = os.path.join("视频分片缓存",video_name) if not os.path.exists(save_path): os.makedirs(save_path) return save_path def download_ts_file(ts_url,save_path,file_index): """单个视频分片下载函数""" file_full_path = os.path.join(save_path,f"{file_index}.ts") # 本地存在文件则跳过下载,实现断点续下 if os.path.exists(file_full_path): print(f"分片{file_index}已存在,跳过下载") return try: resp = requests.get(ts_url,headers=HEADERS,timeout=20) with open(file_full_path,"wb") as f: f.write(resp.content) print(f"分片{file_index}下载完成") except Exception as e: print(f"分片{file_index}下载失败,地址:{ts_url}") def multi_thread_download(ts_list,save_dir): """多线程调度下载所有分片""" thread_task_list = [] for index,ts_url in enumerate(ts_list): task = threading.Thread(target=download_ts_file,args=(ts_url,save_dir,index)) thread_task_list.append(task) # 分批启动线程,防止并发过高被站点封禁IP for i in range(0,len(thread_task_list),THREAD_NUM): batch_task = thread_task_list[i:i+THREAD_NUM] for t in batch_task: t.start() for t in batch_task: t.join() print("所有视频分片批量下载任务执行完毕")

4.2 核心功能解析

  1. 自动创建分类缓存文件夹,不同视频分片独立存放,避免文件混淆错乱;
  2. 加入本地文件校验逻辑,已下载完成的分片直接跳过,完美适配分片下载断点续传需求;
  3. 采用分批启动线程模式,严格控制并发请求数量,防止高频请求触发目标网站 IP 封禁限制;
  4. 以数字序号对分片文件统一命名,严格对应播放顺序,为后续有序合并打下基础。

五、调用 FFmpeg 实现分片无损合并封装

分片文件全部下载完成之后,依靠 Python 代码自动生成合并路径清单文件,静默调用本地 FFmpeg 工具执行后台合并命令,全程无需手动操作命令行,合并完成后自动清理无用缓存分片,精简本地存储空间。

5.1 自动合并完整实现代码

python

运行

import os import subprocess def create_merge_txt(slice_dir): """生成FFmpeg合并所需的路径清单文本文件""" txt_path = os.path.join(slice_dir,"merge_list.txt") with open(txt_path,"w",encoding="utf-8") as f: # 按序号顺序读取分片文件 file_list = [f for f in os.listdir(slice_dir) if f.endswith(".ts")] file_list.sort(key=lambda x:int(x.split(".")[0])) for ts_file in file_list: full_file_path = os.path.join(slice_dir,ts_file) # 写入FFmpeg标准读取格式 f.write(f"file '{full_file_path}'\n") return txt_path def merge_video(txt_path,output_video_path): """调用FFmpeg执行无损合并操作""" # 组装静默合并命令 cmd = [ "ffmpeg", "-f","concat", "-safe","0", "-i",txt_path, "-c","copy", "-y", output_video_path ] try: # 后台执行命令,屏蔽多余输出日志 subprocess.run(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE) print(f"视频合并完成,保存路径:{output_video_path}") return True except Exception as e: print(f"视频合并失败:{str(e)}") return False def clear_slice_cache(slice_dir): """合并完成后清理本地分片缓存文件""" for file in os.listdir(slice_dir): file_path = os.path.join(slice_dir,file) if os.path.isfile(file_path): os.remove(file_path) print("本地分片缓存文件清理完毕")

5.2 合并原理详解

  1. 自动遍历分片文件夹内所有 TS 文件,按照数字序号完成精准排序,彻底杜绝合并后视频画面跳帧、顺序错乱问题;
  2. 生成 FFmpeg 专属路径清单文件,统一管理所有待合并资源路径;
  3. 使用-c copy无损复制参数,合并过程中不重新编码转码,最大限度保留原视频清晰度,同时大幅度缩短合并耗时;
  4. 加入-y自动覆盖参数,输出路径存在同名视频文件时直接覆盖,无需人工确认;
  5. 内置缓存清理函数,合并成功后一键删除所有零碎分片文件,释放本地磁盘存储空间。

六、全流程整合:一站式视频爬取合并主程序

整合索引解析、多线程下载、自动合并、缓存清理所有功能,搭建可直接投入使用的一站式视频采集主程序,仅需传入视频名称与 m3u8 链接,即可全自动完成从抓取分片到生成完整 MP4 视频全部操作。

python

运行

if __name__ == "__main__": # 自定义配置信息 VIDEO_TITLE = "实战教学视频" M3U8_URL = "填写真实抓包获取的m3u8索引链接" # 1.解析提取所有分片地址 ts_data = parse_m3u8(M3U8_URL) if not ts_data: exit("索引解析失败,终止采集任务") # 2.创建专属存储目录 slice_folder = create_save_dir(VIDEO_TITLE) # 3.多线程批量下载分片 multi_thread_download(ts_data,slice_folder) # 4.生成合并清单文件 merge_txt = create_merge_txt(slice_folder) # 5.定义最终完整视频保存路径 final_video = os.path.join("完整视频成品",f"{VIDEO_TITLE}.mp4") os.makedirs("完整视频成品",exist_ok=True) # 6.执行视频合并封装 merge_video(merge_txt,final_video) # 7.清理分片缓存 clear_slice_cache(slice_folder)

七、实战高频问题解决方案与优化技巧

7.1 分片下载常见问题

  1. 分片链接访问 403 权限不足:目标站点开启 Referer 防盗链校验,在请求头内添加对应页面 Referer 地址即可解决;
  2. 部分分片频繁下载失败:网络波动导致资源请求超时,为下载函数增加重试机制,失败分片自动二次请求;
  3. 大批量分片下载 IP 被封禁:降低线程并发数量,加入随机休眠间隔时间,模拟自然人浏览行为节奏。

7.2 视频合并异常处理

  1. 合并后视频音画不同步:原分片本身存在时长错位问题,去除无损复制参数,重新进行全局转码封装;
  2. 合并完成无法正常播放:排查是否为加密分片,未完成解密直接合并会出现黑屏无声现象;
  3. m4s 分离式分片合并失败:拆分视频轨与音频轨分别合并,再通过 FFmpeg 完成双轨道混合封装。

7.3 项目实战优化方案

  1. 加入断点续下功能,程序意外中断重启后自动识别已下载分片,继续下载剩余资源;
  2. 增加视频画质筛选逻辑,优先抓取高清清晰度 m3u8 链接,过滤低分辨率资源;
  3. 搭建批量任务队列,实现多个视频资源排队自动爬取合并,实现无人值守采集;
  4. 增加文件大小校验功能,合并完成后校验视频体积,判断资源是否完整无缺失。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 14:08:12

深入紫光同创PGL50H的DDR3控制器:从IP核配置到AXI接口实战解析

紫光同创PGL50H DDR3控制器深度开发指南:从AXI总线优化到高速数据流设计 在FPGA开发领域,DDR3存储控制器作为连接处理器与高速存储的关键桥梁,其性能优化直接决定了系统整体吞吐量。紫光同创PGL50H搭载的DDR3控制器软核凭借其256bit主机端口和…

作者头像 李华
网站建设 2026/5/16 14:07:09

告别臃肿IDE:w64devkit,一个解压即用的Windows C/C++极简开发包

1. 为什么你需要w64devkit? 如果你经常在Windows上写C/C代码,肯定遇到过这样的烦恼:Visual Studio安装包动不动就几十GB,装完还要配置各种环境变量,光是等它安装完成就能泡杯咖啡。更别提那些复杂的项目配置和莫名其妙…

作者头像 李华
网站建设 2026/5/16 14:07:05

数据结构入门(1):什么是数据结构?什么是算法?

(适用于:备考数据结构期末考试,日常学习理解,面试复习,考研辅助理解) 写在前面 想象一个场景。 你走进一个图书馆。书架上所有的书按类别排列:文学在一层,科技在一层,历史…

作者头像 李华