Column

コラム

  • 【API・データ検証奮闘記】#11.YouTube Data...

【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
管理画面からダウンロードする!?
モブ1
モブ1
プログラムつくる!?
モブ2
モブ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

人気のコラムランキング

PICK UP

企業のDX推進におけるダッシュボード内製化について

DXmarketingPICK UP コラムダッシュボード内製化

企業のDX推進に向けた人材教育支援について

GA4marketingPICK UP コラム内製化

【データプライバシーコラム】電気通信事業法改正の解説(2022年7月時点)

CMPPICK UP コラムデータプライバシーデータプライバシーコラム個人情報保護

CMP導入時の注意点

CMPPICK UP コラムデータプライバシーデータプライバシーコラム個人情報保護

TOPへ
戻る