怎么下載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('視頻片段合成完畢..................')

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM