【Python】Youtube APIで視聴回数を取得してJリーグクラブ人気動画ランキング抽出

FC東京

2021年一発目の投稿。

昨年は様々なSNSのAPIを使って、ゆるい記事を投稿してきましたが、今年も興味を持ったものがあれば投稿していきたいと思います。

さて、今回は動画配信サービス「YouTube」を使って、サッカー(Jリーグ)の人気動画をピックアップしたいと思います。

しかし、単に視聴回数だけだとアプリ内で検索、ソートできるので、高評価、低評価数も加味して、多く見られて、かつ評価も高い動画を各クラブ別に見ていきたいと思います。

※評価基準は完全に独自なのでそこはご自身で色々変えていただけるといいと思います

まず、これをやろうと思ったきっかけですが、最近どの界隈でも、「YouTuber」たる者がはびこっていて、個人的には「那須大亮」さんとか「戸田和幸」さんなど元JリーガーのYouTubeチャンネルが結構好きで見ているのですが、他にも人気の動画や面白い動画を見逃していないか心配で心配で夜も眠れなくなりました。

そんな睡眠不足を解消すべく、1ヶ月寝ずに一生懸命見様見真似でプログラムを作成しました。

寝ずに作成したので、個々雑な所があるかもしれませんが、ご了承いただければと思います。

YouTubeAPIの取得方法

YoutubeAPIの取得方法は以下のサイトが参考になります。今回は人気動画を観ることが主眼なので、ここは省略します。

基本的な手順としては

  1. GoogleAPIConsoleにログインアクセス
  2. ナビゲーションメニューの「APIとサービス」から「YouTube API」を検索
  3. 新しいプロジェクトをナビゲーションに従って作成
  4. 「ダッシュボード」からAPIを有効にする
  5. 「認証情報」を作成して、APIキーが発行されたら完了

大変参考になるサイトはこちら

Kids tube

動画情報の取得方法

基本的にはYou TubeAPIのガイドラインにサンプルコードやパラメータが色々載っているので、こちらを参考にしながら、取ってきたい情報を選択していきます。

Channels  |  YouTube Data API  |  Google Developers

今回取ってきたいなーと思った情報は以下になります。

  • 動画のID
  • 動画のURL(分からなかった…)
  • 動画のタイトル
  • チャンネル名
  • 視聴回数
  • 高評価数
  • 低評価数
  • コメント数(念の為)

これらの動画情報をcsvに吐き出した後に、視聴回数、高評価率※を使って

高評価数/(高評価数+低評価数)=高評価率

それぞれランク付けをして、総合順位の高い動画を選出したいと思います。

動画選出条件としては、

  • 各クラブ名が検索クエリ
  • 視聴回数上位50位以内の動画が対象
  • 動画のカテゴリは選ばない(一応全動画対象で選出したいため)
  • 2021年J1リーグチームが対象
  • スカパー動画、Jリーグ公式チャンネル、DAZN公式チャンネルは対象外とする(できるだけクリエイターの動画を抽出したいため)

取得コード

苦労した点としては、動画のタイトル、チャンネル名はid,snippet関数で取ってこれるのですが、視聴回数は同時に取ってこれず、また別のstatistic関数を使わないといけなかったこと。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import csv

from apiclient.discovery import build

API_KEY = 'xxxx' #APIキーを指定
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
SEARCH_TEXT = 'アビスパ福岡 -スカパー -公式チャンネル -DAZN' #検索したい条件 -で除外したい文字を指定可能

with open('output.csv','w', encoding='utf-8',newline="") as f:
w = csv.writer(f)

youtube = build(
YOUTUBE_API_SERVICE_NAME,
YOUTUBE_API_VERSION,
developerKey=API_KEY
)

search_request = youtube.search().list(part='id,snippet',q=SEARCH_TEXT,type='video',order='viewCount',maxResults=50) #視聴回数上位50位の動画を取得する
#videoCategoryId=17, カテゴリを指定したい場合はこの条件をyoutube.search()関数に挿入
search_response = search_request.execute()
video_ids = [item['id']['videoId'] for item in search_response['items']] #視聴回数などの情報を取得するために一旦置いておく
videos_response = youtube.videos().list(part='statistics',id=','.join(video_ids)).execute() #視聴回数はstatistic関数で取得
video_views = videos_response['items']
videos = [] #id、kindに紐づく
videosinfo = [] #視聴回数に紐づく


for search_result in search_response.get("items",[]):
if search_result["id"]["kind"] == "youtube#video":
videos.append("%s,%s,%s" % (search_result["id"]["videoId"],
search_result["snippet"]["channelTitle"],
search_result["snippet"]["title"]))

for video_result in videos_response.get("items",[]):
if video_result["kind"] == "youtube#video":
try:
videosinfo.append("%s,%s,%s,%s" % (video_result["statistics"]["viewCount"],
video_result["statistics"]["likeCount"],
video_result["statistics"]["dislikeCount"],
video_result["statistics"]["commentCount"]))

except KeyError as l:
videosinfo.append(0)


i=0
w.writerow(["videoId,channelTitle,title,viewCount,likeCount,dislikeCount,commentCount"])
for result in videos:
w.writerow((videos[i],videosinfo[i]))

i+=1
f.close()

with open('output.csv', 'r', encoding='utf-8') as f:
fileText = f.read()
after = fileText.replace('"', '')
print(after)
f.close()

それでは見ていきましょう

コメント

Copied title and URL