视频采集工具 youtube-dl 接口介绍
youtube-dl 接口簡(jiǎn)介
- 0x00. youtube-dl
- 0x01. 使用說(shuō)明
- 0x02. python接口
- 0x03. 開發(fā)注意事項(xiàng)
0x00. youtube-dl
youtube-dl 是一個(gè)通過(guò)命令行下載視頻的工具,其不僅支持 youtube 網(wǎng)站的視頻下載,還支持上百個(gè)不同的視頻網(wǎng)站。用戶可以在官方網(wǎng)站上下載 Windows(exe) 和 Linux(tar.gz) 的版本,之后解壓并使用對(duì)應(yīng)的命令即可。
對(duì)于部分需要使用 youtube-dl 進(jìn)行開發(fā)并且調(diào)用其接口為其他功能服務(wù)的用戶而言,可以在 Github 上找到源碼并且進(jìn)行二次開發(fā),也可以直接調(diào)用其 python 接口。關(guān)于如何在命令行直接使用打包好的 youtube-dl 工具有許多的文檔進(jìn)行介紹,這篇文章主要是對(duì) youtube-dl 提供的一些接口參數(shù)及其功能進(jìn)行說(shuō)明,如有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤綒g迎批評(píng)指正。
0x01. 使用說(shuō)明
Linux/Mac 用戶可以直接用 pip 安裝 youtube-dl 的最新版本:
sudo pip install youtube-dl sudo -H pip install --upgrade youtube-dl或 ( Homebrew )
brew install youtube-dl注:youtube-dl 的庫(kù)版本更新很快,一定要將 youtube-dl 升級(jí)到最新版本,因?yàn)槠浣馕銎骱芸赡軙?huì)隨著版本更新發(fā)生變動(dòng),導(dǎo)致解析結(jié)果不正確或者程序崩潰 ( 在報(bào)錯(cuò)時(shí)可以試試更新能不能解決 ) 。
0x02. python接口
在下載 youtube-dl 源碼后,可以看到 /docs/module_guide.rst 是一個(gè)簡(jiǎn)單的接口介紹文檔,但只有最簡(jiǎn)單的三四個(gè) api 的使用說(shuō)明,本文會(huì)在這個(gè)的基礎(chǔ)上加上作者在使用過(guò)程中自己用到的接口和參數(shù)。
初始化接口
在進(jìn)行下載之前,youtube-dl 需要初始化一個(gè)可以看作是下載器的類,可以在初始化時(shí)指定之后使用的解析器、解析格式、是否需要使用代理等。
文檔中只給出了使用 YoutubeDL() 進(jìn)行初始化的方式,但這個(gè)函數(shù)還可以有一個(gè)字典形式的輸入?yún)?shù),如第2行所示。
這個(gè)參數(shù)決定了在之后的下載過(guò)程中下載器將會(huì)遵循的某些規(guī)則,在源碼中的 /youtube-dl/YoutubeDL.py 文件里有詳細(xì)的注釋說(shuō)明,這里只將常用的幾個(gè)參數(shù)列出來(lái)以供參考。
| outtmpl | string | 下載視頻文件的文件名格式 |
| ignoreerrors | bool | 是否忽略下載過(guò)程中的錯(cuò)誤(不忽略則遇到錯(cuò)誤就程序停止) |
| username | string | 用戶名 (如果當(dāng)前網(wǎng)站需要登錄) |
| password | string | 密碼 (同用戶名) |
| nocheckcertificate | bool | 是否驗(yàn)證SSL證書 (對(duì)于某些網(wǎng)站有用) |
| proxy | string | 指定代理 |
| extract_flat | string | 如果指定 ‘in_playlist’, 則只下載播放列表而不嘗試解析視頻 |
其實(shí)這一部分的第四行代碼,add_default_info_extractors 函數(shù)是指添加一個(gè)默認(rèn)的提取器,但實(shí)際上這個(gè)提取器用戶是可以自定義的,但作者暫時(shí)沒有用到這個(gè)功能,所以這里不會(huì)細(xì)講,但對(duì)于一些 youtube-dl 本身不支持的網(wǎng)站,根據(jù)其框架再編寫一個(gè)新的提取器,應(yīng)該可以適應(yīng)大部分視頻網(wǎng)站的需求。
提取視頻信息與下載視頻
在初始化完畢后,提取信息的接口調(diào)用就比較簡(jiǎn)單了。通過(guò)之前創(chuàng)建的下載器對(duì)象,調(diào)用 extract_info() 函數(shù)。
函數(shù)有兩個(gè)參數(shù),第一個(gè)是 url,如果是視頻 url,會(huì)直接解析視頻信息,而如果是播放列表類型的 url,則會(huì)先解析播放列表,再去解析播放列表中的每個(gè)視頻 (這個(gè)過(guò)程中是不可打斷的,一旦打斷會(huì)從頭開始)。
第二個(gè)參數(shù)是一個(gè)布爾值,True 代表同時(shí)解析視頻詳細(xì)信息和下載視頻,False則不下載視頻,只解析視頻信息。
而這個(gè)函數(shù)的返回值是一個(gè)字典類型的數(shù)據(jù),里面包含了視頻相關(guān)的信息,比如清晰度、上傳者、上傳時(shí)間等等,要了解每一個(gè)參數(shù)的意義可以看這里。
提取播放列表信息
官方文檔中給出的提取播放列表 (playlist) 的方法如下所示,只是將 extract_info 的第二個(gè)參數(shù)改為 False,但作者在實(shí)際開發(fā)過(guò)程中發(fā)現(xiàn),這樣的方式有很大的弊端。
在整個(gè) extract_info 函數(shù)執(zhí)行的過(guò)程中是不允許被打斷的, youtube-dl 本身也沒有實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能,這就導(dǎo)致一旦 playlist 過(guò)長(zhǎng)、視頻太大,程序很可能就因?yàn)榫W(wǎng)絡(luò)波動(dòng)而導(dǎo)致前面的工作白費(fèi)。
因此另一種方案就是先將 playlist 中的所有視頻 url 提取出來(lái) ( 只提取url不下載視頻速度會(huì)很快 ),再逐個(gè)的去下載視頻,并且配合數(shù)據(jù)庫(kù)記錄下載進(jìn)度,能最大程度下規(guī)避網(wǎng)絡(luò)波動(dòng)帶來(lái)的風(fēng)險(xiǎn)。其中的關(guān)鍵代碼如下。
>>> playlist_ydl_opts = {'extract_flat':'in_playlist', 'ignoreerrors': True, 'nocheckcertificate':True} >>> playlist_ydl = YoutubeDL(playlist_ydl_opts) >>> playlist_ydl.add_default_info_extractors() >>> playlist = playlist_ydl.extract_info(playlist_path, download = False) >>> if playlist.has_key('entries') and playlist['entries'] != None: >>> ......0x03. 開發(fā)注意事項(xiàng)
- 在把 youtube-dl 和數(shù)據(jù)庫(kù)結(jié)合在一起的時(shí)候需要注意斷點(diǎn)續(xù)傳的問(wèn)題,如何判斷是否重復(fù)下載、確認(rèn)下載進(jìn)度等等。
- 在下載頻率過(guò)快的時(shí)候有極大幾率被封,尤其是類似于 youtube 之類的大型視頻網(wǎng)站,但一般而言如果是下載視頻的話,速度不會(huì)過(guò)快。但如果只提取信息不下載視頻,那就需要注意這個(gè)問(wèn)題 ( 會(huì)直接封IP幾個(gè)小時(shí)到十幾個(gè)小時(shí) )。
- 可能會(huì)碰到下載到一定數(shù)量,要求提供驗(yàn)證碼的問(wèn)題 (比如 youtube 在下載到200個(gè)左右視頻時(shí)會(huì)出現(xiàn)圖片驗(yàn)證碼)。
本文為作者原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處
總結(jié)
以上是生活随笔為你收集整理的视频采集工具 youtube-dl 接口介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VC对11类NFT初创企业的看法与建议
- 下一篇: 插值算法模型