基于m3u8流媒体格式的视频下载软件编写(一)m3u文件的提取

2023-10-21 08:30

本文主要是介绍基于m3u8流媒体格式的视频下载软件编写(一)m3u文件的提取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于m3u8流媒体格式的视频下载软件编写(一)m3u8文件的提取

写在前面:
  本内容仅作为个人学习python语言、pyqt软件和makedown笔记的记录笔记使用,由于笔者水平较差,由此程序带来的一切问题本人概不负责,文章版权属于笔者个人,转载注明即可

前言

  在日常生活使用中可以从互联网上获得大量的影视资源,但是当处于网络通讯不够通畅的环境时往往希望提前将影视资源进行下载以方便日后的观看,由于笔者在学习python的过程中产生了下载视频的需求,以此为契机,进行了部分研究,作为笔者学习python语言的练习小项目。目前关于html+jsp+css的知识储备不足。在以后的论述中,如果有值得改进的部分,希望读者能指出,笔者也能进一步提升自己的能力。

零.开发环境

  计算机系统:windows 10
  python版本:3.9.0
  编译环境:vscode+Python(插件)+Pylance(插件)
  pyqt版本:待定(还没到这一步)

一.m3u8流媒体格式简述

  m3u8是多数视频网站使用的流媒体格式,主要以文件列表的形式存在,既支持直播又支持点播。它是一种UTF-8编码格式的M3U文件,用于记录索引的纯文本文件。打开M3U8文件时,播放软件并不是直接播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。[1]视频网站将视频片段切分为很短的.ts文件,根据m3u8文件进行播放。因此从视频网站上下载视频需要下完成对m3u8文件的下载。
  使用诸如potplayer的播放器可以直接播放m3u8格式的视频,但是需要从网络上下载,并且要切换视频,使用起来不如直接在网页上观看,因此不推荐直接观看该格式视频。

二.m3u8文件的获取

2.1 浏览器检查功能直接提取

  以chrome为例按下F12或者鼠标在页面空白处右键——>检查——>Network(如图1所示),浏览器右侧会进入如图2所示数据包页面。图2中画圈的m3u8文件下载下来,长的那个就是存.ts视频链接的m3u8文件。直接下载下来即可。
图1

图1.右键检查

图2

图2.Chrome检查面板

2.2 基于urllib库对m3u8文件进行下载

  如果要进行批量下载,显然人工进行下载就不太适合了,经过我在互联网上初步的搜索,目前没有特别直观的自动化处理方法,所以笔者还是使用python来进行处理。使用urllib获取网页信息,beautifulsoup解析urllib的数据,re进行正则替换来获得最终的网址

import urllib.request  # 获取网页数据#
import urllib.parse
import re  # 正则
from bs4 import BeautifulSoup  # 解析网址
2.2.1 m3u8索引下载

  根据笔者目前使用的两个视频网站,如图2所示有两个m3u8文件,但只有一个是真正的.ts视频片段索引文件,另一个存的是这个真正索引文件的部分链接,就是第三行那个。以后将存有.ts文件链接的m3u8文件称为.ts视频索引,而储存m3u8文件链接的称为m3u8索引。

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000,RESOLUTION=1080x608
1000k/hls/index.m3u8

  虽然这些视频网站的源码里也、不会直接出现.ts视频索引的链接,但是会出现m3u8索引的链接(笔者对该网页的链接进行了部分屏蔽处理):

<script>var zanpiancms_player = {"player":"\/public\/","url":"https:\/\/**********\/index.m3u8","next":"http:\/\/www.*******.com\/***********\/1-2.html","name":"1080zyk","apiurl":null,"adtime":"0","adurl":"\/loading.html","copyright":0,"danmu":{"status":0}};</script>

就是这个index.m3u8,将文件打开,就有了.ts视频索引的部分地址,将m3u8索引的连接中的index.m3u8替换为1000k/hls/index.m3u8就可以下载.ts视频索引了

REquest = '视频播放页的网页链接(http://.....com)'  #网页链接
try:response = urllib.request.urlopen(REquest)     #urllib获取网页源码REsponse = response.read().decode('utf-8')     #以utf-8格式解析
except urllib.error.URLError:print("time out")                              #错误处理
bs = BeautifulSoup(REsponse, "html.parser")        #用beautifulsoup分析网页
result = bs.find_all('script')                     #找到<script>段
result_str = str(result)                           #转str
m3u8_Complie = re.compile("https.*m3u8")           #建立正则替换规则获取m3u8索引链接
m3u8_add0 = re.findall(m3u8_Complie, result_str)   #正则提取(https:\/\/*******\/index.m3u8)
m3u8_add_Complie = re.compile(r"\\")               #建立删除'\\'的正则替换规则
m3u8_add = m3u8_add_Complie.sub("", m3u8_add0[0])  #删除'\\'
try:                                               #下载m3u8索引urllib.request.urlretrieve(m3u8_add, 'downaddress.m3u8')
finally:print('downaddress.m3u8_done')

  先使用urllib获取到网页信息,再用beautifulsoup库对网页信息进行解析,使用正则对beautifulsoup解析出的数据进行提取和修改来获得m3u8索引的下载链接。这部分学习了B站up主IT私塾的《Python课程天花板,Python入门+Python爬虫+Python数据分析5天项目实操/Python基础.Python教程》17-23内容[2],re库的部分参考了知乎Wayne的《内行必看!Python Re 模块超全解读!》[3]

  然后再使用 urllib.request.urlretrieve() 下载该文件

f = open('downaddress.m3u8', encoding='utf-8')    #打开m3u8索引
index = f.readlines()                             #按行读取内容
url_tail_Complie = re.compile(".*m3u8")           #提取.ts视频所以规则
for url in index:                                 #正则提取尾部链接URL_tail = re.findall(url_tail_Complie, url)URL = re.sub("index.m3u8", URL_tail[0], m3u8_add) #.ts视频索引提取
try:                                              #下载.ts视频索引urllib.request.urlretrieve(URL, 'index.m3u8')
finally:print('index.m3u8_done')

  在获得了m3u8索引以后,正则提取.ts视频索引的尾部链接,并拼接成对应的下载链接然后下载。至此完成了对m3u8文件的自动化下载,不再需要手动下载了。

最后推荐一个笔者用起来很方便的正则表达式在线测试工具[4]

参考文献

[1]https://baijiahao.baidu.com/s?id=1771477818317416305&wfr=spider&for=pc
[2]https://www.bilibili.com/video/BV12E411A7ZQ/?p=20&vd_source=6bb230b3262b4647b393176cec65c7c5
[3]https://zhuanlan.zhihu.com/p/68014839
[4]https://c.runoob.com/front-end/854/

这篇关于基于m3u8流媒体格式的视频下载软件编写(一)m3u文件的提取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/253175

相关文章

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

使用Python提取PDF大纲(书签)的完整指南

《使用Python提取PDF大纲(书签)的完整指南》PDF大纲(Outline)​​是PDF文档中的导航结构,通常显示在阅读器的侧边栏中,方便用户快速跳转到文档的不同部分,大纲通常以层级结构组织,包含... 目录一、PDF大纲简介二、准备工作所需工具常见安装问题三、代码实现完整代码核心功能解析四、使用效果控

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme