python合并ts视频_python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频
最近發(fā)現(xiàn)一些網(wǎng)站,可以解析各大視頻網(wǎng)站的vip。仔細想了想,這也算是爬蟲呀,爬的是視頻數(shù)據(jù)。
首先選取一個視頻網(wǎng)站,我選的是?影視大全?,然后選擇上映不久的電影 “一出好戲” 。
分析頁面
我用的是chrome瀏覽器,F12進入查看。選擇NetWork的Doc,發(fā)現(xiàn)主體部分的數(shù)據(jù)是從這個網(wǎng)站獲取的。
在地址欄輸入這個鏈接,跳轉(zhuǎn)到了視頻來源的播放頁面。
當然,在這個頁面就可以直接觀看視頻了,但是我們要把視頻下載下來。
尋找視頻文件
仍然是之前那個頁面,在Other中,我們發(fā)現(xiàn)了一些奇怪的東西。
查一下,m3u8是個啥東西。
m3u8是蘋果公司推出一種視頻播放標準,是m3u的一種,不過 編碼方式是utf-8,是一種文件檢索格式,將視頻切割成一小段一小段的ts格式的視頻文件,然后存在服務(wù)器中(現(xiàn)在為了減少I/o訪問次數(shù),一般存在服務(wù)器的內(nèi)存中),通過m3u8解析出來路徑,然后去請求。
這下就清楚了,這就是我們要找的東西。
點擊Response,查看這個.m3u8的文件。觀察發(fā)現(xiàn),.ts后綴的文件地址是有規(guī)律的。我們只需要下載所有的.ts后綴文件,然后把它們整合成一個文件即可。
合并.ts文件
命令行:“copy /b ?F:\f\*.ts??E:\f\new.ts”。
執(zhí)行該命令后,F:\f目錄下的全部TS文件就被合并成一個new.ts文件了(你原來的那堆文件仍然存在)。
這里使用copy命令的文件合并功能進行ts文件的合并,copy后面的?/b??參數(shù)表示把文件按二進制格式來合并,如果不加這個參數(shù),則會把目標當成文本文件來合并,并在文件內(nèi)添加不必要的標記,這會導(dǎo)致播放出錯,所以必須加?/b?參數(shù)。
編寫腳本,下載.ts文件
from urllib importrequestimporturllibfrom time importsleepimportsocketclassCatchVideo(object):def __init__(self):
self.headers= "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"self.url= ""
defset_url(self, i):if i < 1000:
self.url= "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412%03d.ts" %ielse:
self.url= "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412%04d.ts" %i#獲取并下載ts文件
defdl_ts(self, i):
rq=request.Request(self.url)
rq.add_header('User-Agent', self.headers)
response=request.urlopen(rq)
resread=response.read()
with open(str(i)+".ts", "wb") as f:
f.write(resread)
response.close()#關(guān)閉urlopen方法,防止被ban
defstart_work(self):for i in range(0, 1563+1):
self.set_url(i)try:
self.dl_ts(i)print(str(i) + ".ts success")
sleep(1)excepturllib.error.URLError as e:print(e.reason)break
exceptsocket.timeout as e2:print(e2.reason)
self.dl_ts(i)if __name__ == '__main__':
catch_video=CatchVideo()
socket.setdefaulttimeout(20)
catch_video.start_work()
運行過程中,出現(xiàn)了兩次報錯,分別是:
urllib.error.URLError :[WinError 10054]? 遠程主機強迫關(guān)閉了一個現(xiàn)有的連接
socket.timeout? ? ?read讀取超時
解決辦法:
1.增加response.close,關(guān)閉urlopen方法。
2.增加time.sleep,有一秒緩沖時間
3.設(shè)置socket.setdefaulttimeout,給socket預(yù)留緩沖時間
還存在問題
實際運行過程中,腳本執(zhí)行效率略低。之后會加入多線程,繼續(xù)改進,增加運行效率。
參考博客:
更新代碼,加入多進程
修改了start_work方法和主進程:
defstart_work(self, i):
self.set_url(i)try:
self.dl_ts(i)print(str(i) + ".ts success")
sleep(1)excepturllib.error.URLError as e:print(e.reason)
self.dl_ts(i)exceptsocket.timeout as e2:print(e2.reason)
self.dl_ts(i)if __name__ == '__main__':
catch_video=CatchVideo()
socket.setdefaulttimeout(20)#設(shè)置socket層超時時間20秒
I =0while I < 1563+1:#5個進程并發(fā)運行
p_l = [Process(target=catch_video.start_work, args=(i,)) for i in range(I, I+5)]for p inp_l:
p.start()for p inp_l:
p.join()
I= I + 5
這里設(shè)置了5個進程同時運行,太多遠程主機會拒絕請求。
OK,這樣就能很快下載了。隔了幾天終于想起來還有個電影沒看,哈哈 ^_^
總結(jié)
以上是生活随笔為你收集整理的python合并ts视频_python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java做的模板商城_不吹不黑4个超火J
- 下一篇: python 生产者和消费者模式_Pyt