python3.6根據(jù)m3u8下載mp4視頻
需要下載某網(wǎng)站的視頻,chrome瀏覽器按F12打開(kāi)開(kāi)發(fā)者模式,發(fā)現(xiàn)視頻鏈接是以"blob:http"開(kāi)頭的鏈接,打開(kāi)這個(gè)鏈接后找不到網(wǎng)頁(yè),網(wǎng)上查了下,找到了下載方法,在這里做個(gè)記錄,如果有錯(cuò)誤,歡迎指出。
程序在Windows 10下運(yùn)行,不過(guò)Linux應(yīng)該也沒(méi)問(wèn)題。
使用到的有re模塊,requests模塊和Crypto模塊,其中requests模塊和Crypto模塊如果沒(méi)安裝可以使用pip命令安裝。(Crypto模塊安裝感覺(jué)比較坑,我是從anaconda里拷貝了一份)
下面開(kāi)始正題:
注:以下使用的m3u8文件所在的網(wǎng)站是自己搭建用來(lái)測(cè)試的,鏈接可能會(huì)失效。
首先在chrome的network里找到一個(gè)m3u8文件的請(qǐng)求,可以通過(guò)它下載視頻。

通過(guò)Preview可以看到m3u8文件的內(nèi)容。

這里m3u8文件比較重要的內(nèi)容有兩個(gè)。
一個(gè)是URI后面的鏈接,這個(gè)是加密和解密的秘鑰,如果m3u8文件里有這個(gè)URI,那么這個(gè)視頻就是經(jīng)過(guò)了加密的,加密的方法可以看URI前面,這里是AES-128加密算法。
另一個(gè)是以ts結(jié)尾鏈接,這個(gè)是視頻片段,如果是沒(méi)進(jìn)行加密的,可以直接打開(kāi)這個(gè)鏈接下載視頻片段,下載下來(lái)的是后綴為ts的文件,一般可以直接播放,不過(guò)時(shí)間很短。如果是加密過(guò)的,下載后播放會(huì)提示視頻文件已損壞。
知道這些后,就可以進(jìn)行下載了,先獲取m3u8文件的內(nèi)容,然后解析出秘鑰(key)和ts的鏈接,然后下載key對(duì)每一個(gè)ts進(jìn)行解密,保存到一個(gè)mp4文件里。
下載用的是requests模塊,解析key和ts的鏈接是用的re模塊,解密用的是Crypto模塊。
使用Crypto需要注意三個(gè)地方,一個(gè)是安裝和導(dǎo)入,第二個(gè)是Crypto里AES.new的參數(shù),第三個(gè)是decrypt方法的參數(shù)。下面先看代碼。
導(dǎo)入模塊:
import re import requests from Crypto.Cipher import AES
初始設(shè)置:
# 保存的mp4文件名
name = "dream_it_possible.mp4"
# m3u8文件的url
url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8"
# 請(qǐng)求頭,不一定需要,看網(wǎng)站更改
headers = {
"Referer": "http://www.jiuyi.info/video/dream_it_possible",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36",
}
獲取m3u8文件內(nèi)容,并解析出key和ts文件的url。
# 獲取m3u8文件內(nèi)容 r = requests.get(url) # 通過(guò)正值表達(dá)式獲取key和ts的url k = re.compile(r"http://.*?\.key") # key的正則匹配 t = re.compile(r"http://.*?\.ts") # ts的正則匹配 key_url = k.findall(r.text)[0] # key的url ts_urls = t.findall(r.text) # ts的url列表
下載并解密ts文件,保存為mp4文件。
# 下載key
key = requests.get(key_url).content
# 解密并保存ts
for ts_url in ts_urls:
ts_name = ts_url.split("/")[-1] # ts文件名
# 解密,new有三個(gè)參數(shù),
# 第一個(gè)是秘鑰(key)的二進(jìn)制數(shù)據(jù),
# 第二個(gè)使用下面這個(gè)就好
# 第三個(gè)IV在m3u8文件里URI后面會(huì)給出,如果沒(méi)有,可以嘗試把秘鑰(key)賦值給IV
sprytor = AES.new(key, AES.MODE_CBC, IV=key)
# 獲取ts文件二進(jìn)制數(shù)據(jù)
ts = requests.get(ts_url).content
# 密文長(zhǎng)度不為16的倍數(shù),則添加二進(jìn)制"0"直到長(zhǎng)度為16的倍數(shù)
while len(ts) % 16 != 0:
ts += b"0"
# 寫(xiě)入mp4文件
with open(name, "ab") as file:
# decrypt方法的參數(shù)需要為16的倍數(shù),如果不是,需要在后面補(bǔ)二進(jìn)制"0"
file.write(sprytor.decrypt(ts))
print(name, "下載完成")
到這里就下載完成了。
完整代碼:
import re
import requests
from Crypto.Cipher import AES
# 保存的mp4文件名
name = "dream_it_possible.mp4"
# m3u8文件的url
url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8"
# 請(qǐng)求頭,不一定需要,看網(wǎng)站更改
headers = {
"Referer": "http://www.jiuyi.info/video/dream_it_possible",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36",
}
print("正在解析:" + url.split("/")[-1])
# 獲取m3u8文件內(nèi)容
r = requests.get(url)
# 通過(guò)正值表達(dá)式獲取key和ts的鏈接
k = re.compile(r"http://.*?\.key") # key的正則匹配
t = re.compile(r"http://.*?\.ts") # ts的正則匹配
key_url = k.findall(r.text)[0] # key的url
ts_urls = t.findall(r.text) # ts的url列表
# 下載key的二進(jìn)制數(shù)據(jù)
print("正在下載key")
key = requests.get(key_url).content
# 解密并保存ts
for ts_url in ts_urls:
ts_name = ts_url.split("/")[-1] # ts文件名
# 解密,new有三個(gè)參數(shù),
# 第一個(gè)是秘鑰(key)的二進(jìn)制數(shù)據(jù),
# 第二個(gè)使用下面這個(gè)就好
# 第三個(gè)IV在m3u8文件里URI后面會(huì)給出,如果沒(méi)有,可以嘗試把秘鑰(key)賦值給IV
sprytor = AES.new(key, AES.MODE_CBC, IV=key)
# 獲取ts文件二進(jìn)制數(shù)據(jù)
print("正在下載:" + ts_name)
ts = requests.get(ts_url).content
# 密文長(zhǎng)度不為16的倍數(shù),則添加b"0"直到長(zhǎng)度為16的倍數(shù)
while len(ts) % 16 != 0:
ts += b"0"
print("正在解密:" + ts_name)
# 寫(xiě)入mp4文件
with open(name, "ab") as file:
# # decrypt方法的參數(shù)需要為16的倍數(shù),如果不是,需要在后面補(bǔ)二進(jìn)制"0"
file.write(sprytor.decrypt(ts))
print("保存成功:" + ts_name)
print(name, "下載完成")
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python實(shí)現(xiàn)m3u8格式轉(zhuǎn)換為mp4視頻格式
- python爬取m3u8連接的視頻
- python 實(shí)現(xiàn)多線程下載m3u8格式視頻并使用fmmpeg合并
- python爬取基于m3u8協(xié)議的ts文件并合并
- 利用python爬取m3u8格式視頻的具體實(shí)現(xiàn)
- Python通過(guò)m3u8文件下載合并ts視頻的操作
- python將下載到本地m3u8視頻合成MP4的代碼詳解
- Python解析m3u8拼接下載mp4視頻文件的示例代碼
- Python爬蟲(chóng)之m3u8文件里提取小視頻的正確姿勢(shì)
- python基于?Web?實(shí)現(xiàn)?m3u8?視頻播放的實(shí)例
相關(guān)文章
python跳過(guò)第一行快速讀取文件內(nèi)容的實(shí)例
今天小編就為大家分享一篇python跳過(guò)第一行快速讀取文件內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
深入了解python的tkinter實(shí)現(xiàn)簡(jiǎn)單登錄
這篇文章主要為大家介紹了python的tkinter實(shí)現(xiàn)簡(jiǎn)單登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12
python結(jié)合shell查詢google關(guān)鍵詞排名的實(shí)現(xiàn)代碼
這篇文章主要介紹了python結(jié)合shell查詢google關(guān)鍵詞排名的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-02-02
python抽樣方法解讀及實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了python抽樣方法解讀及實(shí)現(xiàn)過(guò)程講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
python 實(shí)現(xiàn)目錄復(fù)制的三種小結(jié)
今天小編就為大家分享一篇python 實(shí)現(xiàn)目錄復(fù)制的三種小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python Matplotlib初階使用入門(mén)教程
本文介紹Python Matplotlib庫(kù)的入門(mén)求生級(jí)使用方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-11-11
Python實(shí)現(xiàn)針對(duì)json中某個(gè)關(guān)鍵字段進(jìn)行排序操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)針對(duì)json中某個(gè)關(guān)鍵字段進(jìn)行排序操作,涉及Python json數(shù)組排序及l(fā)ambda表達(dá)式相關(guān)操作技巧,需要的朋友可以參考下2018-12-12

