はじめに
まずはこちらをご覧ください。
【企画】悪い顔選手権
https://www.youtube.com/watch?v=IEkLSfs1F68
動作環境
- Python 3.6.8
- YouTube Data API ※使用前に登録が必要。
実装内容
-
コメント取得
- Youtube Data APIを使用してコメントとそれに対するリプライコメントを取得する。
- コメント以外の情報(コメントした人のID等)は取得しない。
-
被害届の判定条件
- 「長田①」「松尾2」のように、名前+数字(1~3)が入っている。
- 「~された」のように受動態になっている。
- ただし目撃情報も含みたいので「~いた」も含む。
ソースコード
get_youtube_comments.py
import json
import re
import pandas as pd
import requests
API_KEY = '自分のAPIキーを入力する'
VIDEO_ID = 'IEkLSfs1F68'
def get_comment_info(api_key, video_id, page_token):
comment_url = 'https://www.googleapis.com/youtube/v3/commentThreads'
param = {
'key': api_key,
'videoId': video_id,
'part': 'replies, snippet',
'maxResults': '100',
}
if page_token:
param['pageToken'] = page_token
response = requests.get(comment_url, params=param)
return response.json()
def get_video_comments(api_key, video_id):
comments = []
page_token = ''
while page_token != None:
resource = get_comment_info(api_key, video_id, page_token)
for comment_thread in resource['items']:
# コメント取得
comment = comment_thread['snippet']['topLevelComment']['snippet']['textDisplay']
comments.append(comment)
if ('replies' in comment_thread) and ('comments' in comment_thread['replies']):
for replies in comment_thread['replies']['comments']:
# コメント取得
reply_comment = replies['snippet']['textDisplay']
comments.append(reply_comment)
if 'nextPageToken' in resource:
page_token = resource['nextPageToken']
else:
page_token = None
return comments
# コメントのリストを取得
comments = get_video_comments(API_KEY, VIDEO_ID)
# 改行タグの削除
comments = list(map(lambda x: re.sub('<br />', '', x), comments))
target_list = []
report_comment_list = []
for comment in comments:
target = re.findall('[長田|松尾]+[1-31-3①②③]', comment)
# 複数ある場合はユニーク値だけ取り出す
target = list(set(target))
passive_words = re.findall('(れた|れました|いた|いました)', comment)
if len(target) > 0 and len(passive_words) > 0:
# 1コメントにtargetが複数ある場合はtargetごとにリストに追加する
for t in target:
target_list.append(t)
report_comment_list.append(comment)
df = pd.DataFrame({'target': target_list, 'comment': report_comment_list})
# ランダムに数件表示
df.sample(5, random_state=42)
実行結果
print(df.shape)
->(178, 2)
のべ178件の被害届が出されているようです。
target comment
19 松尾② あまりにも執拗に追いかけてくるので本当に恐怖でした。後ろに幼い子どもも乗せていたので、気が気...
45 長田① 長田①にパーカー盗まれた。
24 長田③ 長田③なお、以前から「神が私と手を取った」と近隣住民に対して話回っていたという情報が多数入っ...
30 松尾② 松尾②に、蟹96匹盗まれました。
67 松尾① 松尾①と長田②と松尾③にオレオレ詐欺されました。
No.24が気になりますね。
まとめ
チョコプラはいいぞ~
参考リンク
参考にさせていただきました。ありがとうございました。
【Python】Youtube Data Apiを使ってコメントを全取得する
YouTube Data APIでコメントとチャンネル登録者を取得する
チョコレートプラネットチャンネル