youtubeが好きで良く見るんですが、動画本編よりもコメント欄を読むのがすごい楽しくて動画の再生が終わってもコメントをずーっとスクロールして読んだりしてます。
youtubeのコメントを使って色々遊びたかったんですが簡単にダウンロードできるツールが見つからなかったので、とりあえずコメントDLマシーンから作っていきます。
youtubeコメントダウンロードマシーンの仕様
- pythonで書く
- データはyoutubeAPIで取得する
- CSVで出力する
- コメントに付いた返信(子コメント)については取得しない(技術的には可能)
とりあえずこの仕様で作っていって変な感じになったら修正するいつもの手順でやります。
youtubeAPIキーの準備

youtubeAPIの実行に必須な要素でgoogleアカウントがあれば無料で何個でも作れます。
googleのアカウント作成からAPIキーの作成までちょっと長いので作業手順は別の記事でまとめています。必要な方は「YouTube APIを利用するための手順を画像付きで丁寧に解説する」を読んでみてください。
チャンネルID/動画IDの取得

youtubeのチャンネルID/動画IDはurlの一部から簡単に取得する事が出来ます。
例えば「https://www.youtube.com/channel/UCIR2mQ77wHrLMreV45nYhgw」というチャンネルurlではスラッシュで区切られた末尾「UCIR2mQ77wHrLMreV45nYhgw」がチャンネルIDとなります。
動画urlが「https://www.youtube.com/watch?v=OGeCHoUjbZo」の場合は、vパラメータの値である「OGeCHoUjbZo」が動画IDとなります。
詳しくは「YouTube APIの仕組みとブラウザだけでデータ取得する方法」 で解説してますんで読んでみてください。
youtubeAPIからコメントに関する情報を取得
youtubeの動画に付いたコメントはyoutubeAPIのCommentThreadsリソースにgetリクエストする(ブラウザにURL張り付けてenterキー押す)事で簡単に取得できます。
https://www.googleapis.com/youtube/v3/commentThreads?key=[APIキー]&part=snippet&videoId=[動画ID]
pythonならyoutubeAPIにリクエストを送るライブラリ(google-api-python-client)もありますが、僕はたまにしか使わないライブラリってすぐ使い方忘れるので、今回は普通にAPI叩いてjsonを取得してます。
CommentThreadsリソースの公式ページはこちら、日本語ページは無さそうですが内容はそんなに難しくないので翻訳しながら読んでみて下さい。
取得できるデータの種類
snippet内に格納されている使えそうなデータを忘れないようにまとめておきます。
| 項目 | 内容 |
| videoId | コメントした動画のID |
| textDisplay | 今表示されているコメント(編集後) |
| textOriginal | 最初投稿したコメント(編集前) |
| authorDisplayName | コメント投稿者の名前 |
| authorProfileImageUrl | コメント投稿者のアイコン |
| authorChannelUrl | コメント投稿者のチャンネルurl |
| authorChannelId | コメント投稿者のチャンネルId |
| canRate | 閲覧者がコメントを評価できるかどうか |
| viewerRating | 閲覧者がコメントに評価したかどうか、like or none |
| likeCount | コメントに付いたいいねの数 |
| publishedAt | コメントの投稿日 |
| updatedAt | コメントの最終更新日 |
僕が使いそうなのは「textDisplay」「likeCount」くらいですかね、現在のAPIの仕様ではコメントに付けられた低評価は取得する事ができないっぽいですね。炎上コメを探すのは難しそうです笑
取得できるコメント数の上限
youtubeのコメントを全件取得する方法を見つけました、具体的にはこんな感じ。


詳しくはnoteの方に仕組みを書きましたんで、必要な方は読んでみて下さい。

取得できるコメント数の上限は使用するフィルタによって異なります。指定できるフィルタは4つありますが使用頻度の高そうな「allThreadsRelatedToChannelId(チャンネル単位でごっそり取得)」と「videoId(動画単位で取得)」を調べてみました。
動画IDを指定した場合は2,000件(videoIdフィルタ使用)

人気動画であれば、数万件以上コメントが付いている動画もありますが、youtubeAPIの仕様上親コメントは2,000件の取得が上限みたいです。たまに何件か足りない事もありますがだいたい2,000件です。
コメント取得の順番は「新しい順」or「関連度の高い順」を選べるので、この基準と組み合わせて用途に近いコメントを取得する感じになりそうですね。
ちなみに僕の環境では、2,000件の親コメントを取得するのに14秒くらいでした。
チャンネルIDを指定した場合は無制限?(allThreadsRelatedToChannelIdフィルタ使用)

CommentThreadsは「allThreadsRelatedToChannelId」を使うとチャンネル単位でごっそりコメントを取得する事も可能です。
上記の画像はチャンネル登録者3万人ほどのyoutuberでテストしたんですが、恐らくすべてのコメントであろう54,631件を取得できました。という事はチャンネル単位ですべてのコメントを取得した後に動画ごとに集計してやれば、動画IDの2,000件制限を突破してすべてのコメントを取得できると思います。
ただしAPIキーにはデフォルトで10,000ユニットしか割り当てられないので、その制限内でやるって事は変わらないんですけどね。大手チャンネルのコメントを全件取得してゴリゴリ分析するには、APIキーの上限を解放してもらうしかなさそうです。
CommentThreadsは1リクエストで1ユニット消費
youtubeAPIのCommentThreadsリソースに1回リクエストを送ると1ユニット消費します。そして1回のリクエストで100件のコメントを取得できるので、理論的にはAPIキー1個で1,000,000件/日のコメントを取得する事ができる計算になります。
CSV出力

出力するファイルは汎用性の高いCSVにしました、僕は表計算はgoogleスプレットシートを使ってますがexcelを使う人も多いと思うのでとりあえずのCSVです。
ファイルには取得できる限りの値をすべて突っ込んでおきます、今は必要なさそうでも後から使うかもしれませんし。
出力ファイルの名前は「youtube-comments-list.csv」とします。
サンプルコード(コピペで動きます)
import requests
import urllib.parse as parse
import csv
API_KEY = "APIキー"
URL_HEAD = "https://www.googleapis.com/youtube/v3/commentThreads?"
nextPageToken = ''
item_count = 0
items_output = [
['videoId']+
['textDisplay']+
['textOriginal']+
['authorDisplayName']+
['authorProfileImageUrl']+
['authorChannelUrl']+
['authorChannelId']+
['canRate']+
['viewerRating']+
['likeCount']+
['publishedAt']+
['updatedAt']
]
#パラメータ設定
video_id = "動画ID"
channelId = "チャンネルID"
exe_num = 1
for i in range(exe_num):
#APIパラメータセット
param = {
'key':API_KEY,
'part':'snippet',
#----↓フィルタ(いずれか1つ)↓-------
#'allThreadsRelatedToChannelId':channelId,
'videoId':video_id,
#----↑フィルタ(いずれか1つ)↑-------
'maxResults':'100',
'moderationStatus':'published',
'order':'relevance',
'pageToken':nextPageToken,
'searchTerms':'',
'textFormat':'plainText',
}
#リクエストURL作成
target_url = URL_HEAD + (parse.urlencode(param))
#データ取得
res = requests.get(target_url).json()
#件数
item_count += len(res['items'])
#print(target_url)
print(str(item_count)+"件")
#コメント情報を変数に格納
for item in res['items']:
items_output.append(
[str(item['snippet']['topLevelComment']['snippet']['videoId'])]+
[str(item['snippet']['topLevelComment']['snippet']['textDisplay'].replace('\n', ''))]+
[str(item['snippet']['topLevelComment']['snippet']['textOriginal'])]+
[str(item['snippet']['topLevelComment']['snippet']['authorDisplayName'])]+
[str(item['snippet']['topLevelComment']['snippet']['authorProfileImageUrl'])]+
[str(item['snippet']['topLevelComment']['snippet']['authorChannelUrl'])]+
[str(item['snippet']['topLevelComment']['snippet']['authorChannelId']['value'])]+
[str(item['snippet']['topLevelComment']['snippet']['canRate'])]+
[str(item['snippet']['topLevelComment']['snippet']['viewerRating'])]+
[str(item['snippet']['topLevelComment']['snippet']['likeCount'])]+
[str(item['snippet']['topLevelComment']['snippet']['publishedAt'])]+
[str(item['snippet']['topLevelComment']['snippet']['updatedAt'])]
)
#nextPageTokenがなくなったら処理ストップ
if 'nextPageToken' in res:
nextPageToken = res['nextPageToken']
else:
break
#CSVで出力
f = open('youtube-comments-list.csv', 'w', newline='', encoding='UTF-8')
writer = csv.writer(f)
writer.writerows(items_output)
f.close()使い方
コード自体はコピペで動きますが取得件数の指定とフィルタの指定(動画かチャンネルどっちから取得するか)はできるようになってますんで、いじり方も書いておきます。
パラメータの入力
5/25/26行目のAPIキー、動画ID or チャンネルIDを入力します。
チャンネル指定か動画指定かを選択
36/37行目でリクエストURLのフィルタを設定しているんですが、APIの仕様上1つしか使用できないんで好きな方を選んで下さい。pythonのコメントアウトは#なので、不要な方の先頭に#を付けます。
例えばチャンネルIDでフィルタしたい場合は、
#----↓フィルタ(いずれか1つ)↓-------
'allThreadsRelatedToChannelId':channelId,
#'videoId':video_id,
#----↑フィルタ(いずれか1つ)↑-------こんな感じで、動画IDでフィルタしたい場合は、
#----↓フィルタ(いずれか1つ)↓-------
#'allThreadsRelatedToChannelId':channelId,
'videoId':video_id,
#----↑フィルタ(いずれか1つ)↑-------として下さい。どっちかしか使わない場合はいらない方のフィルタを消しちゃっても大丈夫です。
動画取得数の指定
APIの実行回数は27行目「exe_num」で指定できますんで、39行目リクエストurlのパラメータ「maxResults」と組み合わせて任意のコメント件数を取得できます。
デフォルトは1リクエストで100件のコメントを取得できるようになってますんで、exe_num = 7とすれば700件のコメントを取得できますし、exe_num = 345とすれば、34,500件のコメントが取得できます。
ただし、動画IDを指定した場合はAPIの仕様上2,000件が上限になっています。
ライブ配信のチャットを取得する
当記事では動画に付けられたコメントを取得する方法を解説してきましたが、ライブ配信で飛び交うチャットを取得する方法は下記の記事でまとめていますんで必要な方は読んでみて下さい。
まとめ
これでyoutubeのコメント取得マシーンは完成したので、youtubeのコメントを使って遊ぶ事ができるようになりました(‘ω’)ノ
分からない事や依頼があれば受け付けてますんでお問い合わせからご連絡下さいm(_ _)m
youtubeのコメントを全取得するアプリを作りました
当記事でyoutubeのコメントを取得するpythonコードを公開していますが、プログラミングが苦手な方や自作している時間が無い方もいると思いますんでデスクトップアプリを作りました。
使っている所はこんな感じ。
このデスクトップアプリはnote記事の方でダウンロードできます。

個人開発プログラマーを応援するメンバーシップを始めました('ω')ノ
質問・要望・共同作業など、みんなのやりたい事をスマイルがお手伝いします。立ち上げたばかりでよく分かってないので、とりあえず何でもありやってみます。




コメント
ソフト買ってやってみましたができませんでした…
何がいけなかったのか全く分からず、諦めます。
管理人のスマイルです(‘ω’)ノ
> ソフト買ってやってみましたができませんでした…
今テストしましたが問題なく動作しております、また他のユーザーさんから同様の問い合わせもありません。

> 何がいけなかったのか全く分からず、諦めます。
必要があればサポートしますんで、お問い合わせからご連絡下さい。
よろしくお願いしますm(_ _)m
こんにちは
購入させて頂いたものです。
excelアプリ、CFV両方で試してみたのですが、どちらも文字化けしてしまいます。
英語表記のコメントについては問題なくコメント取得出来ているようでした。
ご確認宜しくお願いします。
始めまして、DIYプログラミングのスマイルです(‘ω’)ノ
> excelアプリ、CFV両方で試してみたのですが、どちらも文字化けしてしまいます。
申し訳ないんですが、文字化けに関してはお使いの環境由来で起こる物ですので人によって解決方法が異なります。
「excel csv 文字化け」とかで検索すると対応方法が出てくると思うので参考にしてみて下さい。
もしくはgoogleスプレットシートとかで取り込むとすんなり確認できたりします。
よろしくお願いしますm(_ _)m
ありがたや
実行しても全くできません
100件
200件
300件
400件
500件
600件
となりました。
DIYプログラミングのスマイルです(‘ω’)ノ
> 実行しても全くできません
何をしたのか分からないのでアドバイスができません、スクリプトですか?アプリですか?
スクショで画面を見せて頂ければ詳しくアドバイス出来ますんで、お問い合わせからご連絡下さい。
よろしくお願いしますm(_ _)m
import requests
import urllib.parse as parse
import csv
API_KEY = “deleted_hogehoge”
URL_HEAD = “https://www.googleapis.com/youtube/v3/commentThreads?”
nextPageToken = ”
item_count = 0
items_output = [
[‘videoId’]+
[‘textDisplay’]+
[‘textOriginal’]+
[‘authorDisplayName’]+
[‘authorProfileImageUrl’]+
[‘authorChannelUrl’]+
[‘authorChannelId’]+
[‘canRate’]+
[‘viewerRating’]+
[‘likeCount’]+
[‘publishedAt’]+
[‘updatedAt’]
]
#パラメータ設定
video_id = “Thc7JIJk6Co”
channelId = “ntv_news”
exe_num = 20
for i in range(exe_num):
#APIパラメータセット
param = {
‘key’:API_KEY,
‘part’:’snippet’,
#—-↓フィルタ(いずれか1つ)↓——-
#’allThreadsRelatedToChannelId’:channelId,
‘videoId’:video_id,
#—-↑フィルタ(いずれか1つ)↑——-
‘maxResults’:’100′,
‘moderationStatus’:’published’,
‘order’:’relevance’,
‘pageToken’:nextPageToken,
‘searchTerms’:”,
‘textFormat’:’plainText’,
}
#リクエストURL作成
target_url = URL_HEAD + (parse.urlencode(param))
#データ取得
res = requests.get(target_url).json()
#件数
item_count += len(res[‘items’])
#print(target_url)
print(str(item_count)+”件”)
#コメント情報を変数に格納
for item in res[‘items’]:
items_output.append(
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘videoId’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘textDisplay’].replace(‘\n’, ”))]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘textOriginal’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘authorDisplayName’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘authorProfileImageUrl’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘authorChannelUrl’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘authorChannelId’][‘value’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘canRate’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘viewerRating’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘likeCount’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘publishedAt’])]+
[str(item[‘snippet’][‘topLevelComment’][‘snippet’][‘updatedAt’])]
)
#nextPageTokenがなくなったら処理ストップ
if ‘nextPageToken’ in res:
nextPageToken = res[‘nextPageToken’]
else:
break
#CSVで出力
f = open(‘youtube-comments-list.csv’, ‘w’, newline=”, encoding=’UTF-8′)
writer = csv.writer(f)
writer.writerows(items_output)
f.close()
サンプルスクリプトです。
お疲れ様です(‘ω’)ノ
> channelId = “ntv_news”
これはチャンネルIDじゃなくてハンドル名ですね、チャンネルIDはUCuTAXTexrhetbOe3zgskJBQのようです。
実行テストしていませんが確認してみて下さい。
よろしくお願いしますm(_ _)m
ありgありがとうございます。置換しても結果は変わりませんでした。
gasで書きました。別の方法で手前で何とかなりました!!
問題解決したようでよかったです。