python爬取視頻網站m3u8視頻,下載.ts尾碼檔案,合并成整視頻

來源:互聯網
上載者:User

標籤:大全   遠程主機   out   gen   緩衝   with open   遠程   報錯   導致   

最近發現一些網站,可以解析各大視頻網站的vip。仔細想了想,這也算是爬蟲呀,爬的是視頻資料。

 首先選取一個視頻網站,我選的是 影視大全 ,然後選擇上映不久的電影 “一出好戲” 。

分析頁面

我用的是chrome瀏覽器,F12進入查看。選擇NetWork的Doc,發現主體部分的資料是從這個網站擷取的。

 

在地址欄輸入這個連結,跳轉到了視頻來源的播放頁面。

當然,在這個頁面就可以直接觀看視頻了,但是我們要把視頻下載下來。

尋找視頻檔案

仍然是之前那個頁面,在Other中,我們發現了一些奇怪的東西。

查一下,m3u8是個啥東西。

m3u8是蘋果公司推出一種視頻播放標準,是m3u的一種,不過 編碼方式是utf-8,是一種檔案檢索格式,將視頻切割成一小段一小段的ts格式的視頻檔案,然後存在伺服器中(現在為了減少I/o訪問次數,一般存在伺服器的記憶體中),通過m3u8解析出來路徑,然後去請求。

這下就清楚了,這就是我們要找的東西。

點擊Response,查看這個.m3u8的檔案。觀察發現,.ts尾碼的檔案地址是有規律的。我們只需要下載所有的.ts尾碼檔案,然後把它們整合成一個檔案即可。

合并.ts檔案

命令列:“copy /b  F:\f\*.ts  E:\f\new.ts”。

執行該命令後,F:\f目錄下的全部TS檔案就被合并成一個new.ts檔案了(你原來的那堆檔案仍然存在)。

這裡使用copy命令的檔案合并功能進行ts檔案的合并,copy後面的 /b  參數表示把檔案按二進位格式來合并,如果不加這個參數,則會把目標當成文字檔來合并,並在檔案內添加不必要的標記,這會導致播放出錯,所以必須加 /b 參數。

編寫指令碼,下載.ts檔案
from urllib import requestimport urllibfrom time import sleepimport socketclass CatchVideo(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 = ""    def set_url(self, i):        if i < 1000:            self.url = "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412%03d.ts" % i        else:            self.url = "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412%04d.ts" % i    # 擷取並下載ts檔案    def dl_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()# 關閉urlopen方法,防止被ban    def start_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)            except urllib.error.URLError as e:                print(e.reason)                break            except socket.timeout as e2:                print(e2.reason)                self.dl_ts(i)if __name__ == ‘__main__‘:    catch_video = CatchVideo()    socket.setdefaulttimeout(20)    catch_video.start_work()

 

運行過程中,出現了兩次報錯,分別是:

  • urllib.error.URLError :[WinError 10054]  遠程主機強迫關閉了一個現有的串連
  • socket.timeout     read讀取逾時

解決辦法:

  1.增加response.close,關閉urlopen方法。

  2.增加time.sleep,有一秒緩衝時間

  3.設定socket.setdefaulttimeout,給socket預留緩衝時間

還存在問題

實際運行過程中,指令碼執行效率略低。之後會加入多線程,繼續改進,增加運行效率。

 

 

 

參考部落格:

 

80377424

77164521

 

 

python爬取視頻網站m3u8視頻,下載.ts尾碼檔案,合并成整視頻

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.