google colab利用備忘録 youtube情報取得
googlecolabとはブラウザ上でpythonのソースコードを実行できる環境です。
これを使ってyoutubeの情報を取得したときの作業を記録しておきます。
なお2023年12月時点での記録です。サービス終了やツールのサポートが終わってるかもしれません。
準備
google colabへのアクセス
googleアカウントを持ってgoogleドライブにノートブックを作ってそこにアクセス、という形が楽かと思われます。
ドライブとの連携
おまじないのようにgoogleドライブとの接続するのが大事です。
ただ、少し慣れてからでも問題ありません。
プログラム自体はノートブックという形で保存されています。
プログラムで生成されるものを再利用するためには保存しておく場所の準備が必要になってきます。
# googleドライブに保管場所を用意しておく
from google.colab import drive
try:
drive_path = "/content/drive"
drive.mount(drive_path,force_remount=False)
except:
print("...error mounting drive or with drive path variables")
新規ノートブックを作成直後、上記ソースコードを記載し、枠の左側の実行ボタン(▶)を押すことで実行します。
mount の挙動をしたときにgoogleドライブへの接続するかどうか、および
googleドライブ側での許可を求めるポップアップで出てくると思うので、許可することで googleドライブの 「マイドライブ」直下が該当プログラム上の下記パスと一致したものとして扱えます。
/content/drive/MyDrive
私の場合、マイドライブ配下に「AI」というフォルダを作っておいて作業しています。
以降の手順で /content/drive/MyDrive/AI/ と出てくる部分は自分のやりたいようにやってもらえればOKです。
以降ソースコードは、それぞれをブロックごとにコード化して実行ボタン(▶)を押していけば行けるはず。(なお無操作で90分以上経つと接続が解除されるので、googleドライブの接続からやり直しとなります。)
環境のアップデート、ツールの導入
下記のコメントの通りではありますが
pythonやライブラリのアップデート、youtubeのコメントを取得するためのツールソフトを入れます。
今回は下記3つが重要(※)
youtube_dl
youtube-comment-downloader
yt-dlp
#youtube上でコメントを拾ってくるツールをダウンロード、アップデート
!python -m pip install --upgrade pip setuptools
!pip install google-api-python-client
!pip install youtube_dl
!pip install https://github.com/egbertbouman/youtube-comment-downloader/archive/master.zip
!pip install yt-dlp
%cd /content/drive/MyDrive/AI/
!mkdir -p youtube_come_J
!mkdir -p youtube_come_T
※)youtube_dlは yt-dlpに集約できるのかもしれないが、ツールによって使い勝手が大きく変わるため、使い分けています。
ちなみに !XXX というコマンドは一時的なもの(影響は永続)
%XXXというコマンドは 永続的なもの、ということらしいです。
cdやログインするようなコマンドは%、それ以外は!、 という感じでよいのではないかと思います。
ただ、この形だと変数を渡せないので簡単なものしか使いません。
youtubeのコメント取出し
遅ればせながら今回の入出力です。
入力
youtubeでの再生リストのURL (例は陽月るるふさんの歌枠再生リストを利用しています。)
出力
id(URLの個別アドレス) を抜き出したリスト(txt)
タイトルだけ抜き出したリスト(txt)
動画毎に(人気順上から5つ)コメント情報(JSON)
つまりは再生リストにまとめておいてくれれば、そのコメントを取り出しテキストに落としたものを出力しますよ。というものになってます。
(そのあと、本当は曲リストだけとりだすようにしたい・・・)
# 一動画ごとに一ファイルにコメントの情報を持ってくる ためのブロック
# 動画が200個ぐらいあると20分ぐらいは時間がかかる
#コマンド実行するためのサブプロセスをインポート
import subprocess
# 動画の日時をファイル名に利用したい。そのためにyt-dlpというツール(youtube-DLの後継)を使う
from yt_dlp import YoutubeDL
option = {
"skip_download" : "True",
"ignoreerrors" : "True",
"socket_timeout" : "20",
"retries" : "10",
"file_access_retries" : "10"
}
# 動画の情報をyoutube_dlで持ってくる
# ここに再生リストのURLを入れる
list_url = "https://www.youtube.com/playlist?list=PL2dq4rCzqddn-T8VtA0-j1D34mAaIN5l0"
# youotube_id.txt id(URLの個別アドレス) を抜き出したもの エスケープ文字もお構いなしなので注意
# youtube_title.txt タイトルだけ抜き出したもの どこかで使うはず
subprocess.run('youtube-dl --flat-playlist --get-id ' + list_url + ' > /content/drive/MyDrive/AI/youotube_id.txt', shell=True, capture_output=True, text=True)
subprocess.run('youtube-dl --flat-playlist --get-title ' + list_url + ' > /content/drive/MyDrive/AI/youtube_title.txt', shell=True, capture_output=True, text=True)
#ID一覧のファイルを1行ずつ処理
with open('/content/drive/MyDrive/AI/youotube_id.txt') as fi:
for line in fi:
#動画のURLを 入力すると日時を返す。
doga_url = "https://www.youtube.com/watch?v=" + line.rstrip('\n')
# yt-dlpでの動画情報(res)は多すぎるため upload_date から始まった箇所からアップロード日時の情報だけ持ってくる。
with YoutubeDL(option) as ydl:
res = ydl.extract_info(doga_url)
start = str(res).find("upload_date") + 15
end = start + 8
info_upload = str(res)[start:end]
#日時+ID で一意の名前にしたファイルにコメント情報を取得する。 コメントがない動画は出力されないが後でリスト作成用にファイルは作っておいた方が漏れがなくなりそう。
filename = "/content/drive/MyDrive/AI/youtube_come_J/file_%s_" % info_upload + line.rstrip('\n') + ".json"
subprocess.run('youtube-comment-downloader -l 5 -s 0 -y ' + line.rstrip('\n') + ' -o ' + filename , shell=True, capture_output=True, text=True)
subprocess.run('touch ' + filename , shell=True, capture_output=True, text=True)
上記のlist_url の部分を好きな再生リストのURLを入れてもらえれば適当に出力します。
コメント数やソート種を最新順にしたりは変更可能。
反省
サンプルを持ってきた元の作りによるものだが
with YoutubeDL(option) as ydl:
のところはループにしなくてもいいと思いますが
これで動くということを確認できたのでそのまま使うというなまけエンジニアですみません。