怎麼下載m3u8格式視訊?Python爬取A站m3u8格式視訊案例講解
阿新 • • 發佈:2021-08-23
前言
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理。
本篇文章流程
一. 資料來源分析
-
確定需求 (確定要爬的內容是什麼?)。只有知道資料要的是什麼,才能根據實際情況去分析 它的來源
-
怎麼去分析 (開發者工具[瀏覽器都自帶 滑鼠右鍵點選外掛或者F12]) 抓包分析
所有的ts檔案內容 來自 m3u8
有不懂的問題、報錯解答,想要原始碼、視訊教程,資料集的同學也可以點這裡
二. 程式碼實現步驟
- 傳送請求 對於視訊的詳情頁url地址傳送請求
- 獲取資料 獲取視訊的詳情頁網頁原始碼
- 解析資料 提取 m3u8的 url地址 標題
- 傳送請求 對於m3u8的 url地址 傳送請求
- 獲取資料 獲取所有ts url地址(不是完整是需要拼接)
- 傳送請求 對於 ts url地址 傳送請求
- 儲存資料 儲存ts 視訊片段 一個一個視訊片段
- 合成視訊 一個整體視訊內容
程式碼
匯入所需的模組
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('視訊片段合成完畢..................')