はじめに
動画IDとapi keyが必要となります。
api keyはgoogle developer consoleから取得し、環境変数にいれて使用します。
取得の方法についてはgoogle - 承認の認証情報を取得するを参照してください。
(Oauthトークンを取得する必要はありません)
動画IDの取得
動画ページにてhttps://www.youtube.com/watch?v=XXXXXX
のXXXXXX
部分を取るのが簡単だと思いますが、そもそもごそっと取得しようとしているのでこれも自動でやろうと思います。
特定チャンネルの動画IDを集めるのであれば以下のような方法があります。
YouTube Data api v3をPythonから使って特定のチャンネルの動画を取得する
また、google-api-client
のsearch().list
メソッドを用いることで検索クエリによる動画の取得も可能です。
その場合はqiita - PythonとYoutube Data API(v3)で再生数を取得するという記事の方法の方が簡単だと思います。
videos_response = youtube.videos().list(
part="id,snippet,statistics",
id=options.id
).execute()
今回行なっていた特定チャンネルからの動画取得→再生数取得の場合は
- Youtube Data APIのPythonインターフェースにてそれにちょうど合致するものがない
- http request上で
id,snippet,statistics
を同時に指定するとエラー
となるため、それの回避策となります。
動画の閲覧数の取得
さて本題。
videos.csv
はYouTube Data api v3をPythonから使って特定のチャンネルの動画を取得するにて出力したcsv
ファイルです。
そのため、動画idのSeriesであれば、なんでも大丈夫です。
import os
import time
import requests
import pandas as pd
API_KEY = os.environ['API_KEY']
videos = pd.read_csv('videos.csv')
base_url = 'https://www.googleapis.com/youtube/v3'
stat_url = base_url + '/videos?key=%s&id=%s&part=statistics'
len_block = 50
video_ids_per_block = []
video_ids = videos.videoId.values
count = 0
end_flag = False
while not end_flag:
start = count * len_block
end = (count + 1) * len_block
if end >= len(video_ids):
end = len(video_ids)
end_flag = True
video_ids_per_block.append(','.join(video_ids[start:end]))
count += 1
stats = []
for block in video_ids_per_block:
time.sleep(30)
response = requests.get(stat_url % (API_KEY, block))
if response.status_code != 200:
print('error')
break
result = response.json()
stats.extend([item['statistics'] for item in result['items']])
pd.DataFrame(stats).to_csv('stats.csv', index=None)
途中のlen_block
などというのはごそっとバッチで取得するために、url内のid
に,
で結合した動画idを渡すためのものです。
一度に取得できる最大が50件なので、len_block=50
としています。