百行代碼輕松爬取視頻

最近老肥在追劇,遇到了不是VIP無法暢享劇集的小困難。然后我在某強(qiáng)大的搜索引擎中發(fā)現(xiàn)了一個(gè)視頻網(wǎng)站,該網(wǎng)站涵蓋了各大熱門視頻,與VIP的更新速度同步,并且無需等待廣告。
視頻網(wǎng)站?不如我們就寫個(gè)小爬蟲把喜歡的電視劇全部下載到本地,方便隨時(shí)觀看,話不多說,直接開淦!
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?
先來看看單集視頻如何爬取,隨著視頻的播放,我們可以看到一條又一條的ts生成,ts是Transport Stream的縮寫,我們可以理解為是視頻流。這些ts文件大概是幾秒鐘的播放時(shí)長,因而我們后面需要將該集的所有ts文件合并起來以便觀看。

單個(gè)ts文件非常容易爬取,使用requests請求對應(yīng)的url,并將返回的content保存為新的ts文件即可。那么如何獲取所有的ts(或者說這些ts的url)呢,答案就在m3u8之中。m3u8文件實(shí)質(zhì)上是一個(gè)播放列表,其內(nèi)部信息記錄的是一系列的媒體片段資源。

該視頻的所有ts列表均在該m3u8之中。也就是說我們首先需要獲取該視頻的m3u8文件,根據(jù)文件中的ts列表,我們可以將該視頻所有的ts文件下載到本地。
將該視頻所有的ts文件下載之后,我們需要將這些文件合并。如果直接使用命令copy進(jìn)行合并的話,會有文件數(shù)量的限制,本例中就無法將近千個(gè)ts文件合并。因此,我使用了ffmpeg來進(jìn)行合并操作,在代碼中通過os.system執(zhí)行ffmpeg合并命令。
def merge(piece):"""合并ts文件"""os.chdir(vedio_name)with open('temp.txt', 'w') as f:for ts_file in glob('*.ts'):????????????f.write('file?'?+?ts_file?+?'\n')shell_str = 'ffmpeg -f concat -i temp.txt -c copy 第{}集.mp4'.format(piece + 1)os.system(shell_str)print("*****************視頻'{}第{}集'合并成功*****************".format(vedio_name, piece+1))
至此,單集視頻的下載就已經(jīng)完成——不對,這樣下載速度可慢了,如何提速?這里使用了多進(jìn)程,將所有的ts文件等分進(jìn)行視頻的多進(jìn)程下載,為了增加用戶體驗(yàn),這里還加入了進(jìn)度條的顯示,使用tqdm模塊,將各個(gè)進(jìn)程的下載情況以進(jìn)度條的形式顯示。

那么如何下載電視劇的所有分集呢,返回到電視劇的主頁面,這里有各個(gè)分集選項(xiàng),通過查看網(wǎng)頁源代碼,我們可以直接使用xpath、正則或者其他方式來提取,加上網(wǎng)頁前綴即可生成分集頁面的完成url。

通過這些url,我們可以獲取各分集對應(yīng)的m3u8的url,從而獲取相應(yīng)的ts的url,并進(jìn)而經(jīng)過處理獲得完整的視頻。

除此之外,根據(jù)我的觀察發(fā)現(xiàn)這些視頻的前綴url格式一致,僅有一處不同,且該處是電視劇名稱的拼音,因此用戶只需要輸入想要下載的電視劇的中文名稱,通過pypinyin模塊將其轉(zhuǎn)化成拼音,即可完成后面這一系列視頻下載操作,完整的代碼我已上傳,在后臺回復(fù)「視頻」即可獲取。
——END——
推薦閱讀
