利用python爬取m3u8格式視頻的具體實現(xiàn)
m3u8原理
當(dāng)我們在網(wǎng)頁播放視頻時,網(wǎng)頁向服務(wù)器發(fā)起一個以.m3u8結(jié)尾的連接請求,服務(wù)器會將具體的.ts文件鏈接路徑發(fā)送給網(wǎng)頁,網(wǎng)頁接收這寫鏈接路徑,并向這些鏈接發(fā)送請求,請求到的資源就是.ts視頻文件,他和我們常見的mp4文件只是封裝格式的不同,而且.ts文件的大小很小,我爬取的.ts文件只有六秒的視頻文件。之后網(wǎng)頁將這些.ts文件整合在一起并進(jìn)行播放。
腳本環(huán)境
python3.8、win 10
爬取步驟
python要做的事情
1、選擇可以爬取的視頻網(wǎng)站
2、獲取.m3u8的URL路徑
3、通過requests.get獲取.ts文件路徑
4、保存.ts文件
5、合并.ts文件為mp4格式
步驟的具體實現(xiàn)
1、視頻網(wǎng)站:https://www.3s8m.com/
2、隨便選擇一個視頻進(jìn)入播放頁面,按下F12或者Fn+F12,打開審查元素,選擇網(wǎng)絡(luò),刷新頁面,暫停視頻,在審查元素的網(wǎng)絡(luò)頁面選擇XHR(沒有可以直接在全部搜索m3u8),找到以m3u8結(jié)尾的數(shù)據(jù)包,點擊獲取URL
3、python 編寫代碼請求該URL,打印返回的數(shù)據(jù);代碼如下
import requests url = “用第二部找到的URL填入” results = requests.get(url) #發(fā)送get請求 results.encoding=“utf8” #設(shè)置編碼格式,從網(wǎng)頁源碼中的head中可以看編碼格式,這步不關(guān)鍵 print(results.text) #打印結(jié)果 results.close() #關(guān)閉
4、可以發(fā)現(xiàn)第3步中打印結(jié)果有很多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文件,調(diào)用python的os庫,使用系統(tǒng)命令(copy /b a.ts+b.ts a.mp4)進(jìn)行合并
import os os.system(“copy /b a.ts+b.ts a.mp4”)
python細(xì)節(jié)處理說明
1、上述是通過手動查找獲取的m3u8地址,那么為什么不用python去爬取,如果用python去爬取那么就需要對爬取的內(nèi)容進(jìn)行分析檢索,我使用正則進(jìn)行檢索,也可以用xpath、bs4等方式進(jìn)行檢索。
2、一個m3u8地址會對應(yīng)多個ts文件地址,我們應(yīng)該對同一個m3u8的ts地址進(jìn)行整體保存,下載后進(jìn)行整合在一起變?yōu)橐粋€m3u8對應(yīng)一個視頻
3、我們在瀏覽上述提供的網(wǎng)站時會發(fā)現(xiàn),有些資源有不通播放源,有些版源不能用,那么我們在進(jìn)行檢索的時候可以多加一個進(jìn)行源切換的操作
4、至于保存的文件名、文件路徑這些自己返回,具體的代碼下面會提供一個參考。
參考代碼
使用代碼的前提條件及說明:
1、在代碼文件的目錄下建一個名為ts_path的文件夾用于保存爬取過程中的臨時文件(.ts文件)
2、保存的視頻會存放與代碼文件同一目錄線下,視頻名稱為 集數(shù).mp4
3、視頻下載完,ts_path中的文件需要手動刪除,由于之前使用os.system進(jìn)行刪除,誤刪了我不少源碼,決定不加刪除代碼防止意外
4、代碼只是用與上述提供的網(wǎng)站,其他網(wǎng)站需要自己進(jìn)行修改
import requests import re import os URL = "輸入URL" #視頻URL resources = 0 #播放源選擇 episode_urls = [] #存放章節(jié)URL episode_names = [] #存放章節(jié)名稱 m3u8_urls = [] #存放ts文件的URL def get_episode(URL,resources): #獲取章節(jié)名和路徑 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)
總結(jié)
到此這篇關(guān)于利用python爬取m3u8格式視頻的文章就介紹到這了,更多相關(guān)python爬取m3u8格式視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python高階函數(shù)與裝飾器函數(shù)的深入講解
這篇文章主要給大家介紹了關(guān)于Python高階函數(shù)與裝飾器函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python利用 utf-8-sig 編碼格式解決寫入 csv 文件亂碼問題
這篇文章主要介紹了Python利用 utf-8-sig 編碼格式解決寫入 csv 文件亂碼問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02Python 實現(xiàn)使用空值進(jìn)行賦值 None
這篇文章主要介紹了Python 實現(xiàn)使用空值進(jìn)行賦值 None,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03