2021.06.24 コラム
- API
- API・データ検証奮闘記
- Python
- YouTubeDataAPI
【API・データ検証奮闘記】#11.YouTube Data APIやってみた
本コラムでは、APIやデータに関連する言語などを無邪気に触ってみた備忘録として、ライトに記載していきます!
「ちょっと違くない」「他にいい方法あるのに」といったご意見もあるかと思いますが、何卒お手柔らかに!!
<プロフィール>
富松 良介
2017年、株式会社サイバー・コミュニケーションズ(CCI)入社。Oracle Bluekai・Treasure Data等のDMPや、AWS・GCP等のPublicCloud領域を担務。2019年6月よりデータの利活用を推進するコンサルティング会社「株式会社DataCurrent」に出向し、事業会社の基盤構築・運用や自社ソリューション開発を担当。
●YouTube Data APIやってみた

ボス
YouTubeの再生数やコメントの情報データを取得して欲しい。

モブ
!?
かしこまり!!
かしこまり!!
YouTube Data APIでデータ取得する手順から格納した結果までをご紹介致します。
●ステップ1. YouTubeデータ取得調査してみた

モブ1
管理画面からダウンロードする!?

モブ1
プログラムつくる!?

モブ2
ツール契約する!?

意識高いモブ
YouTube Data APIを使えば、VideoIDをもとに動画コメントや再生数を取得できるよ!

モブ
YouTube Data APIで取得することにしよう!!

ボス
それでやってくれ。
●ステップ2. YouTube Data APIでデータ取得してみた
早速APIをたたいてみる。
from apiclient.discovery import build
import math
import time
YOUTUBE_API_KEY = 'YOUR_API_KEY '
class YouTube(object):
def __init__(self, developerKey):
super(YouTube, self).__init__()
self.instance = build('youtube', 'v3', developerKey= developerKey)
def fetch_commentThreads(self, videoId, order, nextPageToken=None):
res = self.instance.commentThreads().list(
part='snippet',
maxResults=100,
videoId=videoId,
order=order,
textFormat='plainText',
pageToken=nextPageToken
).execute()
return res
def fetch_search(self, channelId, nextPageToken=None):
res = self.instance.search().list(
part='snippet',
maxResults=50,
regionCode='JP',
order='viewCount', #視聴回数が多い順に取得
type='video',
channelId=channelId,
pageToken=nextPageToken
).execute()
return res
def fetch_play(self, videoId, nextPageToken=None):
print(nextPageToken)
res = self.instance.videos().list(
part = ['statistics'],
maxResults = 50,
regionCode = 'JP',
pageToken=nextPageToken,
id=videoId
).execute()
return res
def fetch_all_commentThreads(self, videoId, order):
res = self.fetch_commentThreads(videoId, order, nextPageToken=None)
nextPageToken = res.get('nextPageToken')
print(nextPageToken)
while ('nextPageToken' in res):
time.sleep(0.5)
nextPage = self.fetch_commentThreads(videoId, order, nextPageToken=nextPageToken)
res['items'] = res['items'] + nextPage['items']
if 'nextPageToken' not in nextPage:
res.pop('nextPageToken', None)
else:
nextPageToken = nextPage['nextPageToken']
return res
def fetch_all_search(self, channelId):
res = self.fetch_search(channelId, nextPageToken=None)
nextPageToken = res.get('nextPageToken')
print(nextPageToken)
while ('nextPageToken' in res):
time.sleep(0.5)
nextPage =self. fetch_search(channelId, pageToken=nextPageToken)
res['items'] = res['items'] + nextPage['items']
if 'nextPageToken' not in nextPage:
res.pop('nextPageToken', None)
else:
nextPageToken = nextPage['nextPageToken']
return res
def fetch_all_play(self, videoId):
videoIds = []
if isinstance(videoId, str):
res = self.fetch_play(videoId, nextPageToken=None)
elif isinstance(videoId, list):
requestNum = math.ceil(len(videoId)/50)
for i in range(requestNum):
elementStart, elementEnd = i*50, (i+1)*50
videoIds.append(videoId[elementStart:elementEnd])
for j,video in enumerate(videoIds):
if j==0:
res = self.fetch_play(video, nextPageToken=None)
else:
nextVideos = self.fetch_play(video, nextPageToken=None)
res['items'] = res['items'] + nextVideos['items']
time.sleep(0.5)
else:
raise ValueError("videoIdを[str]またはstrの形式で指定します")
return res
youtube = YouTube(YOUTUBE_API_KEY)
#再生数取得
res = youtube.fetch_all_play(
videoId=videoId
)
#コメント取得
res = youtube.fetch_all_commentThreads(
videoId=videoId,
order='time'#relevance,time
)
できた!!!
●ステップ3. 取得結果
動画ごとの再生数やいいね数

動画へのコメント


意識高いモブ
ちなみに、APIコールの上限があるので大量にデータを取得する場合、Google社に上限申請の申し入れとレビューが必要だよ!
●最後に
弊社では、ツール間のデータ連携や設定方法はもちろん、その他データの取り扱いに関する課題に対してトータルで支援しております。
お困りごとございましたら、お気軽にお問い合わせください。
本データに関するお問い合わせは下記にて承ります。
株式会社DataCurrent
info@datacurrent.co.jp