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

人気のコラムランキング

【テックコラム】Chromeブラウザによる User Agent の削減と User-Agent Client Hints への移行

【テックコラム】時系列データの基礎と可視化

22年4月 改正個人情報保護法の施行に向けて Cookieを活用する企業が知っておくべき3つのポイント

【テックコラム】JavaScript Web Crypto API で SHA256 ハッシュ値を作る

【テックコラム】データ活用!相関関係と因果関係の違いと擬似相関について

PICK UP

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

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

CMP導入時の注意点

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

Treasure Data CDPを活用したOneID(統合ID)構築4 日付の落とし穴

CDPCDP活用ID統合PICK UP コラム

今、CMPは導入するべきか?

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

TOPへ
戻る