この記事ではpytubeを使ってYouTubeの動画をダウンロードする方法を解説します。
pytube
を使うことで簡単にYouTubeの動画をダウンロードすることができます。
それでは、早速インストール方法や使い方を見ていきましょう!
pytube
は、pip
でインストールできます。
pip install pytube
pytube
を使うには、まずYouTube
オブジェクトを生成します。
from pytube import YouTube
class YouTube(
url: str,
on_progress_callback: ((Any, bytes, int) -> None) | None = None,
on_complete_callback: ((Any, str | None) -> None) | None = None,
proxies: Dict[str, str] = None,
use_oauth: bool = False,
allow_oauth_cache: bool = True
)
以下のような引数が定義されています。
url | YouTubeの動画のURL |
---|---|
on_progress_callback | 進行状況イベント用のユーザー定義のコールバック関数 |
on_complete_callback | 完了イベント用のユーザー定義のコールバック関数 |
proxies | pytubeによって使用されるプロキシ アドレスへの辞書マッピング プロトコル |
use_oauth | ユーザーにYouTubeへの認証を求めるプロンプトを表示します |
allowed_oauth_cache | OAuth トークンをマシン上でローカルにキャッシュします |
基本的にはダウンロードしたいYouTubeの動画のURLを渡して初期化すれば良い。今回はYouTube Japan 公式チャンネルの「マリオのコミュニティが視聴回数 1000 億回を突破」のURLを使わして頂いてます。
from pytube import YouTube
# ダウンロードしたい動画のURL
url = 'https://www.youtube.com/watch?v=JOfoPFH3DYc'
# YouTubeオブジェクトの生成
yt = YouTube(url)
YouTubeオブジェクトから以下のような情報を取得することができます。
# 動画のタイトル
print(yt.title)
# サムネイルのURL
print(yt.thumbnail_url)
# チャンネルのURL
print(yt.channel_url)
# 動画の説明(概要欄)
print(yt.description)
# チャンネルID
print(yt.channel_id)
# 動画のID
print(yt.video_id)
# レーティング
print(yt.rating)
# 公開日
print(yt.publish_date)
他にもプロパティが定義されているので必要な場合は以下のサイトを参考にしてください。
Linkpytube.__main__ — pytube 15.0.0 documentation
動画をダウンロードするには、ストリームの中から解像度やタイプを選んでfilter()
などで絞り込み、download()
を実行してダウンロードします。
ストリームを取得するにはstreams
を使います。ここでpytube.exceptions.RegexMatchError
という例外が送出された方は 実行できない場合 に飛んでください。
print(yt.streams)
# [<Stream: itag="17" mime_type="video/3gpp" res="144p" fps="8fps" vcodec="mp4v.20.3" acodec="mp4a.40.2" progressive="True" type="video">,
# <Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">, ...]
例えば解像度が720pでMP4の動画をダウンロードしたい場合は以下のような感じになります。
yt.streams.filter(res='720p', file_extension='mp4').first().download()
filter()
メソッドで解像度720pかつMP4の動画に絞り込み、first()
メソッドでその中の最初の要素を取得し、download()
メソッドでダウンロードしています。
他にもorder_by()
メソッドやdesc()
メソッドなどでフィルタリングやソートが可能です。
Linkpytube.query — pytube 15.0.0 documentation
また、download()
メソッドにも多数の引数が定義されています。output_path
引数で保存場所を決めたり、filename
引数でファイル名を変更できたりします。
Linkdownload() - Stream Object - API — pytube 15.0.0 documentation
pytube 15.0.0 を使った場合、streams
を実行するとpytube.exceptions.RegexMatchError
という例外が送出されてしまうことがある。
このエラーは、pytube.exceptions.RegexMatchError: get_throttling_function_name: could not find match for multiple に記述されている通りにpytube
のcipher.py
のfunction_patterns
変数を以下のように書き換えると解消される。
function_patterns = [
# https://github.com/ytdl-org/youtube-dl/issues/29326#issuecomment-865985377
# https://github.com/yt-dlp/yt-dlp/commit/48416bc4a8f1d5ff07d5977659cb8ece7640dcd8
# var Bpa = [iha];
# ...
# a.C && (b = a.get("n")) && (b = Bpa[0](b), a.set("n", b),
# Bpa.length || iha("")) }};
# In the above case, `iha` is the relevant 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
を使ってYouTubeの動画をダウンロードする方法を解説しました。
pytube
のおかげでとても簡単にYouTubeの動画をダウンロードすることができましたが、悪いことに使わないように注意しましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ