僕の世界観を変えてみる

文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。仲良くやろうよ。

【python】pytubeを使ってYouTubeからコンテンツをダウンロードする

f:id:htmllifehack:20180604210953j:plain

pythonにはyoutubeから動画や音声をダウンロードするためのライブラリが存在します。

その名もpytube。

github.com


ってことでpython使いなら簡単にできてしまうpytubeの使い方をメモしていきます。

※ダウンロードは自己責任でお願いします。


pytubeの使い方(コード編)

from pytube import YouTube

# ダウンロードしたいページのurlを入れる。
url = 'https://www.youtube.com/watch?'

# 打つのがめんどうなので変数ytに入れる。
yt = YouTube(url)

# yt.streams.all()で一覧が出るがリストで返ってきてみづらいのでforで回す。
for lis in yt.streams.all():
    print(lis)

# get_by_itagとdownloadでダウンロードができる。
yt.streams.get_by_itag(140).download()

yt.streams.all()で表示される一覧とは画質や拡張子が異なるものが表示されます。

f:id:htmllifehack:20180604224110j:plain

見てわかるようにmime_typeにmp4なのかwebmなのか、画質は720pなのか480pなのかなどなど一行一行異なります。

なので最後にget_by_itagでitagの番号を指定してあげる必要があります。

例えばmp4で音声が欲しかったらget_by_itag(140)という具合です。

1080p、mp4で動画が欲しかったら137です。

実用的にする

このままだといちいちエディタ開いてurl張り付けて実行してitag確認したらもう一度エディタで書き換えてってめんどくさいのでコンソールから指定できるように工夫します。

from pytube import YouTube

url = input('>> Prease enter URL : ')
yt = YouTube(url)
for lis in yt.streams.all():
    print(lis)

tag = input('>> Prease enter itag :')
yt.streams.get_by_itag(int(tag)).download(r'c:\users\owner\music')

input関数を使ってコンソールからurlを張り付けられるようにしました。

ただしinput関数で入力すると数値ではなく文字列になってしまうので注意が必要です。

itagも数値でなければならないのでintを使い数値に変更してからget_by_itagに渡します。

downloadには保存先を指定できるので各々変更してください。

windowsをお使いの場合バックスラッシュがエスケープとされて上手くいかないので先頭にrを付けてください。

これでコマンドプロンプト上ですべて行うことができるようになりました。

簡単に使い方の流れを言うと

コマンドプロンプトを開く→cd c:\users\〇〇\■■.py→urlを張り付けenter→itagの番号を入力してenter

■■は作ったスクリプトの名前、〇〇はそのスクリプトが保存されている場所までのパスです。

pytubeの使い方(コマンドプロンプト編)

pytubeはエディタを使わずにコマンドプロンプトやターミナル上で直接使うことができます。

C:\> pytube http://youtube.com/watch? --list
あるいは
C:\> pytube http://youtube.com/watch? --itag=140

カレントディレクトリに保存されるのでパスは指定しましょう。

上の例だとCドライブに保存されるので、cd c:\users\owner\musicなどと指定。

まとめ

ここまでやれば気付くと思いますがitagの数字は固定のようです。

mp4の音楽の場合はitagは140で固定です。

なので動画は別にダウンロードしないよって方は

from pytube import YouTube

url = input('>> Prease enter URL : ')
yt = YouTube(url)
for lis in yt.streams.all():
    print(lis)

yt.streams.get_by_itag(140).download(r'c:\users\owner\music')

こんな風に書き換えておくとurlを張り付けるだけでダウンロードできます。

手間が省けますね。

余談(pytube使わずに...)

※robots.txtでスクレイピングは禁止されています。

ブラウザには開発者ツールなるものが存在します。

chromeの場合はF12、というかだいたいF12でツールが起動します。

f:id:htmllifehack:20180604231656j:plain

周知のとおりyoutubeはストリーミングです。

画像の赤枠の部分が分割されたurlのようです。

このurlにアクセスしてみると動画は見れるのですが、動画は動画、音声は音声と分かれてしまっています。

仮に、仮にですよ。

分割された範囲を指定してスクレイピングしたとしても動画と音声が分かれてしまっていてはどうにもなりませんよね。

じゃpytubeってどうやっているんでしょうか?

気になる人はpytubeのサイトからpytubeの中身を閲覧してください。

そして仕組みがわかったら教えてください(笑)