標籤:大全 遠程主機 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尾碼檔案,合并成整視頻