1. 程式人生 > 其它 >怎麼下載m3u8格式視訊?Python爬取A站m3u8格式視訊案例講解

怎麼下載m3u8格式視訊?Python爬取A站m3u8格式視訊案例講解

前言

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理。

本篇文章流程

一. 資料來源分析

  1. 確定需求 (確定要爬的內容是什麼?)。只有知道資料要的是什麼,才能根據實際情況去分析 它的來源

  2. 怎麼去分析 (開發者工具[瀏覽器都自帶 滑鼠右鍵點選外掛或者F12]) 抓包分析
    所有的ts檔案內容 來自 m3u8

有不懂的問題、報錯解答,想要原始碼、視訊教程,資料集的同學也可以點這裡

二. 程式碼實現步驟

  1. 傳送請求 對於視訊的詳情頁url地址傳送請求
  2. 獲取資料 獲取視訊的詳情頁網頁原始碼
  3. 解析資料 提取 m3u8的 url地址 標題
  4. 傳送請求 對於m3u8的 url地址 傳送請求
  5. 獲取資料 獲取所有ts url地址(不是完整是需要拼接)
  6. 傳送請求 對於 ts url地址 傳送請求
  7. 儲存資料 儲存ts 視訊片段 一個一個視訊片段
  8. 合成視訊 一個整體視訊內容

程式碼

匯入所需的模組

import requests # 資料請求模組 pip install requests
import re # 正則表示式 內建模組 不需要安裝
import os # 檔案操作
import zipfile # 做壓縮檔案

用python程式碼,對於伺服器傳送請求,伺服器接收到請求之後(確定不是爬蟲程式碼,你是正常客戶端),才會給你返回資料

url = f'https://www.acfun.cn/v/ac23857874

headers = {
    'User-Agent': ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
print(response)

執行程式碼,返回值為200

解析資料 提取m3u8 url地址 標題

元字元 * +

.*? 萬用字元 可以匹配任意字元(除了\n) 匹配文字 匹配數字 字母 特殊字元 re.S

\ 轉義字元 把含有特殊含義的字元轉成除了字元本身以外 沒有其他意思

[0] 正則表示式提取出來的內容 返回是列表 [0] 0 是指列表索引位置 索引位置是0 是列表裡面的第一個元素

[0,1,2,3,4,5] img\ 我轉義我自己

() 表示精確匹配 ? 非貪婪匹配

title = re.findall('<title >(.*?) - AcFun彈幕視訊網 - 認真你就輸啦 \(\?ω\?\)ノ- \( ゜- ゜\)つロ</title>', response.text)[0]
m3u8_url = re.findall('"backupUrl(.*?)\"]', response.text)[0].replace('\"', '').split('\')[2]
m3u8_data = requests.get(url=m3u8_url, headers=headers).text
print(m3u8_url)

正則解析

正則表示式替換 re.sub() join 是把列表轉成字串

\d 匹配數字 \d+匹配多個數字 * 匹配前一個字元0個或者多個無數個

m3u8_data = re.sub('#EXTM3U', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-VERSION:\d', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-TARGETDURATION:\d', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-MEDIA-SEQUENCE:\d', '', m3u8_data)
m3u8_data = re.sub('#EXTINF:\d\.\d+,', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-ENDLIST', '', m3u8_data)
m3u8_data = m3u8_data.split()

for link in m3u8_data:
    # 字串拼接 加上 才是完整url地址 構建完整的url地址
    link_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/hls/' + link  

儲存檔案 你確定檔案儲存路徑 儲存檔案的名字 字尾

link_content = requests.get(url=link_url, headers=headers).content
link_name = link.split('.')[1]
with open(filename + link_name + '.ts', mode='w') as f:
    f.write(link_content)

合併視訊

files = os.listdir(filename)
print('開始視訊片段合成..................')

with zipfile.ZipFile(filename + title + '.mp4', mode='w') as z:
    for file in tqdm(files):
        path_file = filename + file
        z.write(path_file)
        os.remove(path_file)


print('視訊片段合成完畢..................')