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