【Python】Youtube APIを使ってチャンネルや動画の情報を取得する

Tips

目的

タイトルそのまま、PythonでYoutubeの情報を色々取得したかった。

 

事前準備

API KEYの取得

Youtube APIを使うにはAPI KEYというものが必要。

手順は以下を参照。

【Google APIs】Youtube API Key を取得する方法
みんな大好きYoutube それを色々こねくり回したいなーと思い、APIのお勉強を使用かと思いましたが、 YoutubeのAPIを使用するにはAPI KEYというものが必要とのこと。 どうやら無料で作成できるようなので、手順をまとめてみまし

 

モジュールのインストール

# pip install --upgrade google-api-python-client

python3 で利用する場合はpip3で。

 

ソースコード

# coding:utf-8

#==========================
# インポートモジュール
#==========================
from apiclient.discovery import build
from apiclient.errors import HttpError
import sys

#==========================
# グローバル変数
#==========================
args = sys.argv # CLI引数格納
API_KEY = '************************************'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
youtube = build(
  YOUTUBE_API_SERVICE_NAME, 
  YOUTUBE_API_VERSION,
  developerKey=API_KEY
  )

#==========================
# 関数
#==========================

## 検索結果の詳細を配列にして全て返却する(主にデバッグとかに使用する)
def searchDetails(_keyword, max=25):
  search_response = youtube.search().list(q=_keyword, part='id,snippet', maxResults=max).execute()
  details = []
  for search_result in search_response.get("items", []):
    details.append(search_result)
  
  return details

## チャンネル名を検索してチャンネル名とチャンネルIDを配列で返却する
def searchChannels(_keyword, max=25):
  search_response = youtube.search().list(q=_keyword, part='id,snippet', maxResults=max).execute()
  channels = []
  for search_result in search_response.get("items", []):
    if search_result["id"]["kind"] == "youtube#channel":
      channels.append([search_result["snippet"]["title"],search_result["id"]["channelId"]])
    
  return channels

## チャンネルIDから紐づくビデオIDを取得する(detail=TrueならIDだけでなくすべての情報を返す)
def getVideoInfo(_channelid, max=50, detail=False):
  searches = []
  nextPagetoken = None
  nextpagetoken = None
  while True:
    if nextPagetoken != None:
      nextpagetoken = nextPagetoken
    
    search_response = youtube.search().list(
      part = "snippet",
      channelId = _channelid,
      maxResults = max,
      order = "date", #日付順にソート
      pageToken = nextpagetoken #再帰的に指定
      ).execute()
    
    for search_result in search_response.get("items", []):
      if search_result["id"]["kind"] == "youtube#video":
        if detail:
          searches.append(search_result)
        else:
          searches.append(search_result["id"]["videoId"])
    try:
      nextPagetoken =  search_response["nextPageToken"]
      print('[INFO] NextPageToken is ' + nextPagetoken)
    except Exception as e:
      print('[INFO] NextPageToken is Null. Stop get video detail.')
      break
  
  return searches

 

ちょっと躓いた点だけ補足。

API_KEY = '************************************'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
youtube = build(
  YOUTUBE_API_SERVICE_NAME, 
  YOUTUBE_API_VERSION,
  developerKey=API_KEY
  )

これはおまじないみたいなもの。インスタンス化する。

API_KEYは事前準備で取得したAPI_KEYを入力する。

 

search_response = youtube.search().list(q=_keyword, part='id,snippet', maxResults=max).execute()

search APIを叩くところ。

partはidとsnippetどちらかを指定できる。

基本的には両方入れておくのが良い。(帰ってくるものがidとsnippet両方になるだけなので)

少しでも処理データ量を削減したいのであればどちらかだけにする。

 

search_response = youtube.search().list(
      part = "snippet",
      channelId = _channelid,
      maxResults = max,
      order = "date", #日付順にソート
      pageToken = nextpagetoken #再帰的に指定
      ).execute()

特にnextpagetokenあたりは全然理解できなかったが、

YoutubeAPIは一気にmax50件しか取得できないので、50以上の動画を投稿しているチャンネルは全てを取得できない。

が、pageTokenというステータスにToken(文字列)を渡してあげることで、その続きを取得できるようになるらしい・・・。

ちなみにpageTokenは戻ってくる情報に挿入されているらしい。

 

参考

【Python】YouTube Data API v3を利用した特定チャンネルの動画情報取得 | Analytics Board | python特化のプログラミングサイト
実は需要の高いプログラミングスキルの中に、外部機能を利用するための仕組みとしてAPI技術が存在します。本記事では、様々なAPIの中でも人気が高まってきているYouTube Data API v3を利用していきたいと思います。また、クラウドソーシングサービスであるクラウドワークスやランサーズの案件も確認しながら、取り進め...

コメント

タイトルとURLをコピーしました