天天看點

使用python下載下傳網頁上的m3u8視訊流

作者:榮碼天涯

有時候,我們在網頁上追劇的時候,出于各種原因,希望将這些視訊下載下傳到本地。接下來,我們用python撸一段代碼來實作。

使用python下載下傳網頁上的m3u8視訊流

1 抓包:擷取.m3u8的請求位址

具體步驟:

  • 在浏覽器中打開視訊網頁
  • F12打開開發者工具,并切換至網絡标簽
  • 重新整理該網頁,發現網絡的清單中加載了多個請求
  • 在篩選器框中,輸入m3u8過濾其他無關的請求
  • 點選m3u8請求,切換至預覽,确認下請求文本是否是ts檔案的請求清單,如果是,說明我們抓取的位址是正确的,ts檔案是視訊線上播放時,被切割的視訊片段,我們可以從中任意複制一條,在浏覽器中打開,浏覽器會自動彈出下載下傳該檔案的對話框,下載下傳完成後,其實是可以用視訊播放軟體播放該視訊的。
使用python下載下傳網頁上的m3u8視訊流

2 撸代碼

2.1 使用requests,請求上一步的.m3u8結尾的url

import requests
from fake_useragent import UserAgent
# .m3u8的請求位址
url = 'https://m3u.haiwaikan.com/xm3u8/c67187e521c6459f9cdd4731bff1e96e3c32d6d99d6c4f68be0469232320c8389921f11e97d0da21.m3u8'
# 設定代理(有些網站需要科學上網才能通路)
proxies = {"https": "http://127.0.0.1:10887"}
# 将請求包裝成浏覽器端通路,防止有些網站反爬蟲
ua = UserAgent()
headers = {
'User-Agent': ua.random
}
response = requests.get(url, headers=headers, proxies=proxies)
content = response.text
print(content)           
使用python下載下傳網頁上的m3u8視訊流

debug看下已經拿到了ts檔案清單了

2.2 解析上面的響應結果,提取ts連結清單

# 将文本拆分為行
lines = content.split('\n')
ts_urls = []
# 周遊文本提取ts視訊片段的位址
for i in range(0, len(lines)):
if lines[i].startswith("https:"):
ts_urls.append(lines[i])           

2.3 周遊ts連結清單,使用requests逐個通路各個清單,将結果寫入本地磁盤,該步驟會在盤符下生成多個ts檔案;

# 指定儲存的檔案路徑:因為權限問題,該路徑必須先建立好
save_dir = '/Users/zhaoyang/Downloads/ts_demo/'
for i in range(0, len(ts_urls)):
ts_resp = requests.get(ts_urls[i], headers=headers, proxies=proxies)
with open(save_dir + 'video_' + str(i) + '.ts', 'wb') as f:
f.write(ts_resp.content)           
使用python下載下傳網頁上的m3u8視訊流

2.4 将多個ts檔案合并一個大的ts檔案

with open(save_dir + 'all.ts', 'wb') as outfile:
for i in range(0, 351):
file_name = save_dir + 'video_' + str(i) + '.ts'
with open(file_name, 'rb') as infile:
outfile.write(infile.read())           
使用python下載下傳網頁上的m3u8視訊流

多個ts檔案合并成大檔案

2.5 使用ffmpeg将大的.ts檔案轉換成.mp4

需要在電腦上安裝好ffmpeg,并添加到環境變量

# 轉換為MP4格式
subprocess.call(['ffmpeg', '-i', save_dir + 'all.ts', '-c', 'copy', save_dir + 'output.mp4'