最近我接触到了大数据方面的工作,其中需要爬取视频数据。今天我们在爬取视频网站时使用了m3u8格式来进行视频播放。我特意去搜了一下m3u8,发现现在大部分视频客户端都采用了HTTP Live Streaming(HLS)技术,这是苹果为了提高流播效率开发的一项技术。与直接播放MP4等视频文件不同,HLS将流媒体切分为若干TS片段,并通过一个扩展的M3U8列表文件将这些TS片段批量下载供客户端播放器实现实时流式播放。因此,在爬取HLS流媒体文件时,我们一般的思路是先下载M3U8文件并分析其中的内容,然后根据文件中定义的TS片段进行批量下载,最后将它们组合成MP4文件或直接保存TS片段。虽然这个过程听起来很简单,但在实际操作中会遇到一些复杂的问题;例如m3u8文件下载不下来,ts片段文件被加密了,甚至加密ts片段的密钥也被加密了。本文将分享一个实际案例供大家参考。
还是按照爬虫的基本规则:
- 打开视频播放地址分析视频的规律,尝试可以独立打开视频下载链接
- 编写python获取视频列表下载视频脚本
一、视频的分析
网站链接:
让我们 打开F12 从响应时间中找一下那些有肯能是视频链接的请求接口
接着我们点那个搜索输入m3u8刷新
然后显示有带.ts的我们继续观察发现有个带m3u8
发现里面有许多.ts,这个就是我们需要的m3u8 .ts所有列表了,我们取这个url获取ts,当然这个地址需要拼接下
二、代码
上完整代码,我没合并哈,
import requests
import re
import os
#获取ts列表
def get_ts(url):
resp_m3u8=requests.get(url).content.decode('utf-8')#返回网页获取信息
list_ts=re.findall(r'(.*?).ts',resp_m3u8)#通过正则表达式提取ts列表
return list_ts
def download_ts(paths,url_lis):
#检查路径是否存在
if not os.path.exists(paths):
os.makedirs(paths)
con=0
# print(len(url_lis))
for i in url_lis:
m3u8_url=f'https://m3u8i.vodfile.m1905.com/202308181134/b5cbc61e114a6a945227fa5513529198/movie/2021/12/17/m20211217COB1O9SRFTA2840Y/{i}.ts'
print(m3u8_url)
# # 设置保存的地址
path_1=paths+'\\'+str(con)+'.ts'
try:
video=requests.get(m3u8_url).content
with open(path_1,'wb') as m3u8:
m3u8.write(video)
print(f"下载成功,已第{con}个")
con+=1
except:
print("下载失败")
if __name__ == '__main__':
path=r'E:\测试\1905电影\ts'
path2=r'E:\测试\1905电影\视频'
url=''获取m3u8链接自己填
m3u8_ts=get_ts(url)
download_ts(path,m3u8_ts)
# merge(path,path2)
看效果
我这里省流,就没去合并视频,后面合并的步骤也简单。