Python3爬蟲通過(guò)m3u8文件下載ts視頻 Python爬蟲

什么是m3u8文件??M3U8文件是指UTF-8編碼格式的M3U文件。

M3U文件是記錄了一個(gè)索引純文本文件淘捡,打開(kāi)它時(shí)播放軟件并不是播放它焦除,而是根據(jù)它的索引找到對(duì)應(yīng)的音視頻文件的網(wǎng)絡(luò)地址進(jìn)行在線播放作彤。

原視頻數(shù)據(jù)分割為很多個(gè)TS流,每個(gè)TS流的地址記錄在m3u8文件列表中

比如我這里有一個(gè)m3u8文件竭讳,文件內(nèi)容如下:

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-MEDIA-SEQUENCE:0

#EXT-X-ALLOW-CACHE:YES

#EXT-X-TARGETDURATION:15

#EXTINF:6.916667,

out000.ts

#EXTINF:10.416667,

out001.ts

#EXTINF:10.416667,

out002.ts

#EXTINF:1.375000,

out003.ts

#EXTINF:1.541667,

ts 文件一般怎么處理???

1 只有m3u8文件灿渴,需要下載ts文件

2 有ts文件逻杖,但因?yàn)楸患用軣o(wú)法播放闻伶,需要解碼

3 ts文件能正常播放滨攻,但太多而小,需要合并

4 本篇文章處理第1和第2條內(nèi)容诞帐,加密部分跳過(guò)停蕉。

上面我提供的ts文件中并沒(méi)有加密愕鼓,也就是沒(méi)有關(guān)鍵字key ,下載ts文件之后直接合并即可

ts文件路徑獲取

由于上面的m3u8文件中所有的ts文件都是相對(duì)地址慧起,所以需要依據(jù)上篇博客中獲取到的鏈接

{'url': 'https://videos5.jsyunbf.com/2019/02/07/iQX7y3p1dleAhIv7/playlist.m3u8', 'ext': 'dplay', 'msg': 'ok', 'playertype': None}

其中前面的部分是ts的播放地址的前綴地址

# https://videos5.jsyunbf.com/2019/02/07/iQX7y3p1dleAhIv7/out005.ts

import datetime,requests

# m3u8是本地的文件路徑

def get_ts_urls(m3u8_path,base_url):?

? ? urls = []

? ? with open(m3u8_path,"r") as file:

? ? ? ? lines = file.readlines()

? ? ? ? for line in lines:

? ? ? ? ? ? if line.endswith(".ts\n"):

? ? ? ? ? ? ? ? urls.append(base_url+line.strip("\n"))

? ? return urls

ts文件下載

所有的路徑讀取完畢之后,需要對(duì)ts文件進(jìn)行下載估灿,文件的下載辦法很多

def download(ts_urls,download_path):

? ? for i in range(len(ts_urls)):

? ? ? ? ts_url = ts_urls[i]

? ? ? ? file_name = ts_url.split("/")[-1]

? ? ? ? print("開(kāi)始下載 %s" %file_name)

? ? ? ? start = datetime.datetime.now().replace(microsecond=0)

? ? ? ? try:

? ? ? ? ? ? response = requests.get(ts_url,stream=True,verify=False)

? ? ? ? except Exception as e:

? ? ? ? ? ? print("異常請(qǐng)求:%s"%e.args)

? ? ? ? ? ? return

? ? ? ? ts_path = download_path+"/{0}.ts".format(i)

? ? ? ? with open(ts_path,"wb+") as file:

? ? ? ? ? ? for chunk in response.iter_content(chunk_size=1024):

? ? ? ? ? ? ? ? if chunk:

? ? ? ? ? ? ? ? ? ? file.write(chunk)

? ? ? ? end = datetime.datetime.now().replace(microsecond=0)

? ? ? ? print("耗時(shí):%s"%(end-start))

下載過(guò)程顯示甲捏,表示下載成功,剩下的就是拼網(wǎng)速的時(shí)候了大溜。

下載完畢,是一大堆ts文件付材,記住,只要一個(gè)可以看厌衔,就可以合并了

合并ts文件? ? ?使用copy命令?如果不清楚锣夹,就去百度即可

在windows系統(tǒng)下面页徐,直接可以使用:copy/b *.ts video.mp4? 把所有ts文件合成一個(gè)mp4格式文件

copy/b D:\newpython\doutu\sao\ts_files\*.ts d:\fnew.ts

代碼合并

import os

from os import path

def file_walker(path):

? ? file_list = []

? ? for root, dirs, files in os.walk(path): # 生成器

? ? ? ? for fn in files:

? ? ? ? ? ? p = str(root+'/'+fn)

? ? ? ? ? ? file_list.append(p)

? ? print(file_list)

? ? return file_list

def combine(ts_path, combine_path, file_name):

? ? file_list = file_walker(ts_path)

? ? file_path = combine_path + file_name + '.ts'

? ? with open(file_path, 'wb+') as fw:

? ? ? ? for i in range(len(file_list)):

? ? ? ? ? ? fw.write(open(file_list[i], 'rb').read())

if __name__ == '__main__':

? ? #urls = get_ts_urls("playlist.m3u8","https://videos5.jsyunbf.com/2019/02/07/iQX7y3p1dleAhIv7/")

? ? #download(urls,"./tsfiles")

? ? combine("./ts_files","d:/ts","haha")

最終合并之后,形成一個(gè)ts文件贴唇,當(dāng)然你還可以用軟件把視頻轉(zhuǎn)換成mp4格式

也可以利用FFMPEG可以直接實(shí)現(xiàn)m3u8 轉(zhuǎn)MP4

備注部分

m3u8文件中的 m3u8標(biāo)簽與屬性說(shuō)明

#EXTM3U

每個(gè)M3U文件第一行必須是這個(gè)tag,請(qǐng)標(biāo)示作用

#EXT-X-VERSION:3

該屬性可以沒(méi)有

#EXT-X-MEDIA-SEQUENCE:140651513

每一個(gè)media URI在PlayList中只有唯一的序號(hào)豌熄,相鄰之間序號(hào)+1,

一個(gè)media URI并不是必須要包含的蹄皱,如果沒(méi)有,默認(rèn)為0

#EXT-X-TARGETDURATION

指定最大的媒體段時(shí)間長(zhǎng)(秒)。所以#EXTINF中指定的時(shí)間長(zhǎng)度必須小于或是等于這

個(gè)最大值署拟。這個(gè)tag在整個(gè)PlayList文件中只能出現(xiàn)一 次(在嵌套的情況下歌豺,一般有

真正ts url的m3u8才會(huì)出現(xiàn)該tag)

#EXT-X-PLAYLIST-TYPE

提供關(guān)于PlayList的可變性的信息,這個(gè)對(duì)整個(gè)PlayList文件有效区宇,是可選的,格式

如下:#EXT-X-PLAYLIST-TYPE::如果是VOD议谷,則服務(wù)器不能改變PlayList 文件述寡;

如果是EVENT,則服務(wù)器不能改變或是刪除PlayList文件中的任何部分,但是可以向該

文件中增加新的一行內(nèi)容掸屡。

#EXTINF

duration指定每個(gè)媒體段(ts)的持續(xù)時(shí)間(秒),僅對(duì)其后面的URI有效,title是

下載資源的url

#EXT-X-KEY

表示怎么對(duì)media segments進(jìn)行解碼碗淌。其作用范圍是下次該tag出現(xiàn)前的所有media

URI,屬性為NONE 或者 AES-128纳像。NONE表示 URI以及IV(Initialization

Vector)屬性必須不存在憔购, AES-128(Advanced EncryptionStandard)表示URI

必須存在,IV可以不存在山卦。

#EXT-X-PROGRAM-DATE-TIME

將一個(gè)絕對(duì)時(shí)間或是日期和一個(gè)媒體段中的第一個(gè)sample相關(guān)聯(lián)肮雨,只對(duì)下一個(gè)meida

URI有效,格式如#EXT-X-PROGRAM-DATE-TIME:

For example: #EXT-X-PROGRAM-DATETIME:2010-02-19T14:54:23.031+08:00

#EXT-X-ALLOW-CACHE

是否允許做cache箱玷,這個(gè)可以在PlayList文件中任意地方出現(xiàn)怨规,并且最多出現(xiàn)一次,作

用效果是所有的媒體段锡足。格式如下:#EXT-X-ALLOW-CACHE:

#EXT-X-ENDLIST

表示PlayList的末尾了波丰,它可以在PlayList中任意位置出現(xiàn),但是只能出現(xiàn)一個(gè)舶得,格

式如下:#EXT-X-ENDLIST

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掰烟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纫骑,老刑警劉巖蝎亚,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異先馆,居然都是意外死亡发框,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門煤墙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梅惯,“玉大人,你說(shuō)我怎么就攤上這事番捂「鲞螅” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵设预,是天一觀的道長(zhǎng)徙歼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鳖枕,這世上最難降的妖魔是什么魄梯? 我笑而不...
    開(kāi)封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮宾符,結(jié)果婚禮上酿秸,老公的妹妹穿的比我還像新娘。我一直安慰自己魏烫,他們只是感情好辣苏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著哄褒,像睡著了一般稀蟋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呐赡,一...
    開(kāi)封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天退客,我揣著相機(jī)與錄音,去河邊找鬼链嘀。 笑死萌狂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怀泊。 我是一名探鬼主播茫藏,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼霹琼!你這毒婦竟也來(lái)了刷允?” 一聲冷哼從身側(cè)響起冤留,我...
    開(kāi)封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碧囊,失蹤者是張志新(化名)和其女友劉穎树灶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糯而,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡天通,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熄驼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片像寒。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瓜贾,靈堂內(nèi)的尸體忽然破棺而出诺祸,到底是詐尸還是另有隱情,我是刑警寧澤祭芦,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布筷笨,位于F島的核電站,受9級(jí)特大地震影響龟劲,放射性物質(zhì)發(fā)生泄漏胃夏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一昌跌、第九天 我趴在偏房一處隱蔽的房頂上張望仰禀。 院中可真熱鬧,春花似錦蚕愤、人聲如沸答恶。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悬嗓。三九已至,卻和暖如春砂沛,著一層夾襖步出監(jiān)牢的瞬間烫扼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工碍庵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留映企,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓静浴,卻偏偏與公主長(zhǎng)得像堰氓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苹享,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容