最近工作中,遇到了讲一个m3u8的文件下载到本地,使用代码如下:
import urllib.request
m3u8file = os.path.join(folderPath, dirName + '.m3u8')
urllib.request.urlretrieve(m3u8url, m3u8file)
不过上述代码有个小问题,就是需要使用代理的时候,比较难办。
于是,当需要遇到代理的时候,还是用了老办法。
import requests
import os
os.environ['ALL_PROXY']='http://127.0.0.1:10809'
# 拆分url并以此创建保存路径
url='https://xxx.com/aaa/bbb/'
urlSplit = url.split('/')
dirName = urlSplit[-2]
if not os.path.exists(dirName):
os.makedirs(dirName)
folderPath = os.path.join(os.getcwd(), dirName)
# 从页面中提取m3u8 url
result = re.search("https://.+m3u8", dr.page_source)
m3u8url = result[0]
m3u8urlList = m3u8url.split('/')
m3u8urlList.pop(-1)
downloadurl = '/'.join(m3u8urlList)
# 保存m3u8 file至文件夹
m3u8file = os.path.join(folderPath, dirName + '.m3u8')
response = requests.get(m3u8url)
# 获取的文本实际上是图片的二进制文本
m3u8_content = response.content
# 将它拷贝到本地文件 w 写 b 二进制 wb代表写入二进制文本
with open(m3u8file,'wb' ) as f:
f.write(m3u8_content)
#解析m3u8文件,组合成最终下载链接,下载后,使用ffmpeg组合
m3u8obj = m3u8.load(m3u8file)
m3u8uri = ''
m3u8iv = ''
for key in m3u8obj.keys:
if key:
m3u8uri = key.uri
m3u8iv = key.iv
# ts网站 in tsList
tsList = []
for seg in m3u8obj.segments:
tsUrl = downloadurl + '/' + seg.uri
tsList.append(tsUrl)
# 有加密
if m3u8uri:
m3u8keyurl = downloadurl + '/' + m3u8uri # 得到 key 的网址
print(m3u8keyurl)
# 得到 key的內容
response = requests.get(m3u8keyurl, headers=headers, timeout=10)
contentKey = response.content
vt = m3u8iv.replace("0x", "")[:16].encode() # IV取前16位
ci = AES.new(contentKey, AES.MODE_CBC, vt) # 建构解析码
else:
ci = ''
# 刪除m3u8 file
deleteM3u8(folderPath)
# 下载mp4片段至文件夹
prepareCrawl(ci, folderPath, tsList)
# 合成mp4
mergeMp4(folderPath, tsList)
# 刪除子mp4
deleteMp4(folderPath)
# 转换
encode =3
ffmpegEncode(folderPath, dirName, encode)