首頁 > 軟體

利用python爬取m3u8格式視訊的具體實現

2022-08-05 14:02:48

m3u8原理

當我們在網頁播放視訊時,網頁向伺服器發起一個以.m3u8結尾的連線請求,伺服器會將具體的.ts檔案連結路徑傳送給網頁,網頁接收這寫連結路徑,並向這些連結傳送請求,請求到的資源就是.ts視訊檔,他和我們常見的mp4檔案只是封裝格式的不同,而且.ts檔案的大小很小,我爬取的.ts檔案只有六秒的視訊檔。之後網頁將這些.ts檔案整合在一起並進行播放。

指令碼環境

python3.8、win 10

爬取步驟

python要做的事情

1、選擇可以爬取的視訊網站

2、獲取.m3u8的URL路徑

3、通過requests.get獲取.ts檔案路徑

4、儲存.ts檔案

5、合併.ts檔案為mp4格式

步驟的具體實現

1、視訊網站:https://www.3s8m.com/

2、隨便選擇一個視訊進入播放頁面,按下F12或者Fn+F12,開啟審查元素,選擇網路,重新整理頁面,暫停視訊,在審查元素的網路頁面選擇XHR(沒有可以直接在全部搜尋m3u8),找到以m3u8結尾的封包,點選獲取URL

3、python 編寫程式碼請求該URL,列印返回的資料;程式碼如下

import requests
url = 「用第二部找到的URL填入」
results = requests.get(url) #傳送get請求
results.encoding=「utf8」 #設定編碼格式,從網頁原始碼中的head中可以看編碼格式,這步不關鍵
print(results.text) #列印結果
results.close() #關閉

4、可以發現第3步中列印結果有很多URL地址,這些地址就是ts檔案的地址,python下載ts檔案

import request
url =「填入獲取到的ts檔案的URL」
results = requests.get(url)
results.encoding =「utf8」
with open("./a.ts",「wb」) as file:
file.write(results.content)
results.close()

5、合併全部的ts檔案,呼叫python的os庫,使用系統命令(copy /b a.ts+b.ts a.mp4)進行合併

import os
os.system(「copy /b a.ts+b.ts a.mp4」)

python細節處理說明

1、上述是通過手動查詢獲取的m3u8地址,那麼為什麼不用python去爬取,如果用python去爬取那麼就需要對爬取的內容進行分析檢索,我使用正則進行檢索,也可以用xpath、bs4等方式進行檢索。

2、一個m3u8地址會對應多個ts檔案地址,我們應該對同一個m3u8的ts地址進行整體儲存,下載後進行整合在一起變為一個m3u8對應一個視訊

3、我們在瀏覽上述提供的網站時會發現,有些資源有不通播放源,有些版源不能用,那麼我們在進行檢索的時候可以多加一個進行源切換的操作

4、至於儲存的檔名、檔案路徑這些自己返回,具體的程式碼下面會提供一個參考。

參考程式碼

使用程式碼的前提條件及說明:

1、在程式碼檔案的目錄下建一個名為ts_path的資料夾用於儲存爬取過程中的臨時檔案(.ts檔案)

2、儲存的視訊會存放與程式碼檔案同一目錄線下,視訊名稱為 集數.mp4

3、視訊下載完,ts_path中的檔案需要手動刪除,由於之前使用os.system進行刪除,誤刪了我不少原始碼,決定不加刪除程式碼防止意外

4、程式碼只是用與上述提供的網站,其他網站需要自己進行修改

import requests
import re
import os

URL = "輸入URL" #視訊URL
resources = 0   #播放源選擇

episode_urls = [] #存放章節URL
episode_names = [] #存放章節名稱
m3u8_urls = []  #存放ts檔案的URL

def get_episode(URL,resources): #獲取章節名和路徑
    results = requests.get(URL)
    results.encoding = "utf-8"
    all = results.text
    results.close()
    episode = re.findall('<ul class="dslist-group">.*?</ul>', all, flags=re.S)
    b = re.finditer('href=".*?</a>', episode[resources],flags=re.S)
    for i in b:
        i = i[0].replace('href="', "").replace('"', "")
        episode_urls.append("https://www.3s8m.com" + i.split('>', 1)[0])
        episode_names.append(i.split('>', 1)[1].replace("</a>", ""))
    print(episode_names)
    print(episode_urls)


def get_ts(episode_urls): #獲取ts檔案路徑
    for i in episode_urls:
        results = requests.get(i)
        results.encoding = "utf8"
        results = re.search('https:.*?.m3u8', str(results.text),flags=re.S)
        m3u8_urls.append(results[0].replace("\", ""))
    print(m3u8_urls)


def download_video(episode_names, m3u8_urls): #下載ts檔案並整合為mp4檔案
    for i in range(len(m3u8_urls)):
        try:
            print(m3u8_urls[i])
            results = requests.get(m3u8_urls[i])
            results.encoding = "utf8"
            all = re.finditer("https://.*?#", results.text, flags=re.S)
            results.close()
            cmd = []
            n = 0
            for j in all:
                n += 1
                ts_url = j[0].replace("n#", "")
                cmd.append(f'{n}.ts')
                results = requests.get(ts_url,)
                results.encoding = "utf8"
                with open(f"./ts_path/{n}.ts", "wb") as file:
                    file.write(results.content)
                results.close()
                print(f"{n}.ts 下載完成")
            os.chdir("ts_path")
            if ("ts_path" in os.getcwd()):
                cmd = "+".join(cmd)
                cmd = f"copy /b {cmd} {episode_names[i]}.mp4"
                os.system(cmd)
                os.system(f"move {episode_names[i]}.mp4 ../")
            os.chdir("../")
            print(f"{episode_names[i]}.mp4 下載成功")
        except Exception as e:
            print(e)
            exit(0)

if __name__ == '__main__':
    get_episode(URL, resources)
    get_ts(episode_urls)
    download_video(episode_names, m3u8_urls)

總結 

到此這篇關於利用python爬取m3u8格式視訊的文章就介紹到這了,更多相關python爬取m3u8格式視訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com