YouTubeのコメントをpythonで取得してCSVで保存する

youtube

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の方に仕組みを書きましたんで、必要な方は読んでみて下さい。

youtubeの動画に付いてるコメントはAPIで全件取得できる|DIYプログラミング|note
youtubeの動画に付いているコメントを割と簡単にAPIから全件取得できましたんでご紹介。 youtubeコメントの全件取得検証 再生回数1億回を超えるhikakinさんの「YouTubeテーマソング/ヒカキン&セイキン」に付けられた87,992件のコメントを全件取得してみます。 pythonでごにょごにょ。...

取得できるコメント数の上限は使用するフィルタによって異なります。指定できるフィルタは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のコメントを取得するpythonコードを公開していますが、プログラミングが苦手な方や自作している時間が無い方もいると思いますんでデスクトップアプリを作りました。

使っている所はこんな感じ。

このデスクトップアプリはnote記事の方でダウンロードできます。

youtubeのコメントを簡単にCSVで取得するツールをpythonで作った|DIYプログラミング|note
以前youtubeのコメントをpythonで取得するpythonコードを書いたんですが、せっかくなんでデスクトップアプリにしてみました。 アプリの名前は「YCG」と言います。 コピペしてボタン押すだけなんで誰でも使えると思います、使用感はこんな感じ。 YCGで出来る事 YCGはYouTubeの動画IDを指定...

youtubeのコメントを簡単に取得できる無料webツールを公開しました

ライトな感じで使えるyoutubeコメントのデータ取得webツール「YCDL」を作りました。無料&会員登録不要でyoutubeのコメントをCSVでダウンロードしたりネガポジ分析したりできます。

使用感はこんな感じ。

良かったら使ってみてね(‘ω’)ノ→ YCDL

まとめ

これでyoutubeのコメント取得マシーンは完成したので、youtubeのコメントを使って遊ぶ事ができるようになりました(‘ω’)ノ

分からない事や依頼があれば受け付けてますんでお問い合わせからご連絡下さいm(_ _)m

コメント