本サイトでは YouTube Data API v3 をよく使っているので、その使い方を紹介します。
今回は YouTube ではお馴染みのコメント欄の収集に関する記事になります。
はじめに
想定する読者
プログラミングをあまりしたことがないが、何かコードでしてみたい人。
玄人(エンジニア)など、簡単にコピペして使いたい人
本記事でできること
動画 ID を指定することによって、YouTube の動画のコメントを収集するコードを作成します。
準備
まずは、API を使って通信するための準備を行います。
「API KEY がないよ」って人がいましたら、こちらの記事で作成の方法を解説していますので作成をお願いします。
from apiclient.discovery import build
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
API_KEY = 'xxxxxxxxxx' # 取得した API キーを記述
youtube = build(
YOUTUBE_API_SERVICE_NAME,
YOUTUBE_API_VERSION,
developerKey=API_KEY
)
コメント収集のコード
次にコメントを集めたい動画の ID を調べましょう。
動画 ID は、YouTubeの動画の URL に埋め込まれています。
それでは、動画に紐づいたコメントを集める関数を書きましょう。
import requests
from typing import Dict
def get_comment_info(videoId: str, key: str, pageToken: str = "") -> Dict:
comment_url = "https://www.googleapis.com/youtube/v3/commentThreads"
param = {
"key": key,
"videoId":videoId,
"part": "replies, snippet",
"maxResults": "100",
}
if pageToken:
param["pageToken"] = pageToken
req = requests.get(comment_url, params=param)
return req.json()
この関数に API KEY と動画 ID を与えることによって、コメントを最大100件まで返すことができます。
次にコメントごとに for ループを回すことで、必要な情報をピックアップします。
一般的に必要そうな要素だけ選んでいますが、他の情報が必要であれば適宜追加をしてみてください。
if “replies” in comment_thread: の中では、返信についても収集を行っています。ここでは、topLebelComment が False であれば、そのコメントが返信であることを意味します。
req = get_comment_info("指定する動画のID", API_KEY, pageToken)
comments=[]
for comment_thread in req["items"]:
snippet = comment_thread["snippet"]
topLevelComment_snippet = snippet["topLevelComment"]["snippet"]
try:
video_id = snippet["videoId"]
author_name = topLevelComment_snippet["authorDisplayName"]
author_channel = topLevelComment_snippet["authorChannelId"]["value"]
publishedAt = topLevelComment_snippet["publishedAt"]
likeCount = topLevelComment_snippet["likeCount"]
textOriginal = topLevelComment_snippet["textOriginal"]
topLebelComment = True
comments.append((video_id, author_name, author_channel, publishedAt, likeCount, textOriginal, topLebelComment))
if "replies" in comment_thread:
if "comments" in comment_thread["replies"]:
for replies in comment_thread["replies"]["comments"]:
author_name = replies["snippet"]["authorDisplayName"]
author_channel = replies["snippet"]["authorChannelId"]["value"]
publishedAt = replies["snippet"]["publishedAt"]
likeCount = replies["snippet"]["likeCount"]
textOriginal = replies["snippet"]["textOriginal"]
topLebelComment = False
comments.append((video_id, author_name, author_channel, publishedAt, likeCount, textOriginal, topLebelComment))
except Exception:
print(snippet)
何かしらの理由で正しく動作しなかったケースのために、Try & Exception でエラー処理を書いています。
(API を使う場合は、アクセス量がオーバーした場合にアクセスし続けることや、その時点までで集めたデータを紛失することを避ける必要があります。)
データの保存とロード
最後に集めたデータを扱いやすい pandas の DataFrame に変換しておきましょう。
import pandas as pd
comment_df = pd.DataFrame(comments, columns=["video_id", "author_name", "channel_id", "publishedAt", "likeCount", "textOriginal", "topLebelComment"])
comment_df.to_pickle("./comments.pkl")
後で処理を行う場合は
pd.read_pickle("./comments.pkl")
で簡単に読み出すことができます。
100件以上のコメントを取得
人気動画のように、コメント数が100件を超える場合には pageToken を用いることによって解決することができます。
単純にコメント収集のコードに対して、以下のように pageToken による処理を追加すれば実現可能です。
pageToken = ""
while pageToken != None:
####
"コメント収集のコード"
####
if "nextPageToken" in req:
pageToken = req["nextPageToken"]
else:
pageToken = None
まとめ
お疲れ様でした!
今回は YouTube の動画のコメントを集めるコードについて紹介しました。
データの保存方法や pageToken を用いて複数の request をひと繋がりする方法も解説しました。
今後も分析記事で使っているコードの紹介をしていきたいと思っています。
あなたが自分の手でコードを書く助けになれば幸いです。
本サイトでは、YouTube の API を使って得た情報をもとにチャンネル分析を行ったりしていますので、ぜひそちらの記事ものぞいて行ってください。