看到好的影片想要保存下來,或不想被廣告亂入,可使用 Python 下載 YouTube 影片,存在本機隨時觀看,Python套件包羅萬象,任何工作幾乎都有善心人士開發對應的套件,幫我們大大的提高了生產力,以下就介紹如何利用 pytube 套件下載 YouTube 影片。
pip install pytube
from pytube import YouTube
# YouTube 影片id
id = 'A-6c584jxX8'
# 下載單一影片
YouTube('https://www.youtube.com/watch?v='+id) \
.streams.get_highest_resolution().download()
影片id 可在播放的影片按滑鼠右鍵,選【複製影片網址】,擷取網址最後一段或【v=】後面的值。
哇,只要一行就可以下載 YouTube 影片,太厲害了。但是,過了一段時間,升級pytube套件至v15.0.0,突然出現以下錯誤:
pytube.exceptions.RegexMatchError: get_throttling_function_name: could not find match for multiple。
找了一陣子,發現這一篇可解決問題,修改套件安裝目錄的cipher.py如下:
# function_patterns in get_throttling_function_name 函數
# 最後兩行改為:
r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&.*?\|\|\s*([a-z]+)',
r'\([a-z]\s*=\s*([a-zA-Z0-9$]+)(\[\d+\])?\([a-z]\)',
我們可以一次下載播放清單內所有影片,使用pytube的Playlist類別,可抓到清單內所有影片的超連結。
from pytube import YouTube
from pytube import Playlist
def download_youtube_series(playlist1):
# 播放清單
playlist = Playlist(playlist1)
# 所有影片的超連結
for link in playlist:
# 下載單一影片
YouTube(link).streams.get_highest_resolution().download()
youtube_id = link[link.find('v=')+2:]
print(f"{youtube_id} downloaded!")
print ("All videos downloaded!")
return
if __name__ == "__main__":
download_youtube_series('https://www.youtube.com/playlist?list=PLJV_el3uVTsPM2mM-OQzJXziCGJa8nJL8')
上述程式還有一點改進空間,影片是循序下載,效率不彰,可以改用多執行緒(Multi-threading),同步下載所有影片,程式如何改呢? 就請大家提供解答嘍。多執行緒可參考『Python 多執行緒 threading 模組平行化程式設計教學』或期待下一次介紹嘍。
開發者必學:OpenAI API應用與開發。
ChatGPT企業實踐指南 | 技術透析與整合應用。
深度學習PyTorch入門到實戰應用。
ChatGPT 完整解析:API 實測與企業應用實戰。
Scikit-learn 詳解與企業應用。
開發者傳授 PyTorch 秘笈
深度學習 -- 最佳入門邁向 AI 專題實戰。