最近工作中,遇到了讲一个m3u8的文件下载到本地,使用代码如下:
import urllib.requestm3u8file = os.path.join(folderPath, dirName + '.m3u8')
urllib.request.urlretrieve(m3u8url, m3u8file)
不过上述代码有个小问题,就是需要使用代理的时候,比较难办。
于是,当需要遇到代理的时候,还是用了老办法。
import requests
import osos.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.urim3u8iv = key.iv# ts网站 in tsList
tsList = []
for seg in m3u8obj.segments:tsUrl = downloadurl + '/' + seg.uritsList.append(tsUrl)# 有加密
if m3u8uri:m3u8keyurl = downloadurl + '/' + m3u8uri # 得到 key 的网址print(m3u8keyurl)# 得到 key的內容response = requests.get(m3u8keyurl, headers=headers, timeout=10)contentKey = response.contentvt = 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)