本文主要是介绍基于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文件。直接下载下来即可。
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文件的提取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!