Python3下载m3u8

前言

最近爬网站视频的时候发现视频都是用m3u8的格式,不能直接下载

百度借鉴了一下下载方法后,就写了一个适合自己的方法

思路

m3u8 文件实质是一个播放列表(playlist),了解这个之后下载就比较简单了。

只需要把列表一个一个合并成url,就可以全部下载,再合并成一个视频

前提是这个m3u8没有加密,加密什么的太烦了!

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import requests
import os
import time


# 获取m3u8下载链接
def get_ts_urls(m3u8_index):
# 储存m3u8链接
m3u8_urls = []
# get获取
m3u8s = requests.get(m3u8_index).text
# 拆分
m3u8s = m3u8s.strip()
m3u8s = m3u8s.split('\n')
# print(m3u8s)
for m3u8 in m3u8s:
# print(m3u8)
# 判断 #
if m3u8.find('#') == -1:
# print(m3u8)
# 获取前缀
m3u8_server = url_m3u8_index.replace(url_m3u8_index.split('/')[-1], '')
# 合并
m3u8_url = m3u8_server + m3u8
# print(m3u8_url)
# 添加到 list
m3u8_urls.append(m3u8_url)
print(m3u8_urls)
return m3u8_urls


# 下载视频
def down_m3u8(urls):
ts_names = []
for url in urls:
# print(url)
try:
res = requests.get(url).content
try:
os.mkdir('临时下载文件夹')
except:
pass
ts_name = '临时下载文件夹/' + url.split('/')[-1]
ts_names.append(ts_name)
with open(ts_name, 'wb') as f:
f.write(res)
print('开始下载{}'.format(ts_name))
except:
pass
# 合并视频
t = time.strftime("%Y%m%d%H%M%S", time.localtime())
file_path = str(t) + '.ts'
with open(file_path, 'wb') as fl:
for i in ts_names:
fl.write(open(i, 'rb').read())
# 删除原视频
os.remove(i)
# 删除文件夹
try:
os.rmdir('临时下载文件夹')
except:
pass


if __name__ == '__main__':
url_m3u8_index = 'https://v.jingruila.com/public/videos/60ef8b9e05097b2cfd6e9071/index.m3u8'
m3u8_urls = get_ts_urls(url_m3u8_index)
# print(m3u8_urls)
down_m3u8(m3u8_urls)
print('下载完成')

后记

这个方法只适合部分m3u8下载,因为它比较简陋。

本文有个福利哦,认真学习的同学就能发现。。。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!