見出し画像

YouTubeの特定チャンネルの動画情報を取得する方法【オードリーさん、ぜひ会ってほしい人がいるんです。】【無料版】

はじめに

お久しぶりです!pipotteruです。
前回の記事(↓)で力尽きてしまい、記事を書く気力が湧いていませんでした笑

ただ、裏ではゴニョゴニョ色々とやってました!
ちょっと内容がまとまってきたので頑張って記事を書いていきたいと思います笑
よろしくお願いします!

本題

今回は、YouTubeAPIを用いて特定チャンネルの動画情報を取得する方法を記事にまとめていきたいと思います。
好きなチャンネルの動画を色々観てみたいけど、動画数が多いと良さげな動画を探すのがめんどくさかったりしませんか?
CSVとかでざっと確認できるようになったら楽だなぁと思って今回の記事を作成しました!
※注意点!!※
動画を取得するのではなく、動画のURLや再生回数やライク数、コメント数をまとめたCSV形式でまとめていきます。

今回、動画情報を取得するチャンネルは、私が大好きなチャンネルの
【公式】オードリーさん、ぜひ会ってほしい人がいるんです。にします!

スクリーンショット 2021-08-14 23.59.06

普通に面白いのでまだ観たことない知らない!という方はぜひご視聴くださいね!
(オードリーをあまり知らなくても楽しめると思いますよ!私はこのチャンネルを通してオードリーのコト好きになりました!)

今回も(気力があれば)無料版と有料版の記事を作成していきたいと思います。
無料版ではYouTubeAPIとPythonを使ってCSVに動画情報を取得する方法を述べます。無料版だけでそこは完結させます。
有料版では、以下の2つを共有する予定です。
1:"【公式】オードリーさん、ぜひ会ってほしい人がいるんです。"の動画情報を私の方で取得したCSVデータ(2021年7月30日までの全999件の動画)
2:Pythonスクリプト
を保存したリンク先を共有したいと思います!

手順1:YouTubeAPIキーを取得

YouTube Data API v3を使うためにキーを取得します。
コチラの神記事を参考にしてください!

https://blog.codecamp.jp/programming-api-youtube

Googleアカウントがあれば利用可能ですが、Google Cloud Platform(GCP)を通して取得しますので、GCPに触れてない人には敷居が高いかもしれないので、記事の内容を踏んで取得されるのが効率よいかと思います!

(記事にも書かれていますが、)APIには「Quota」という通信量の利用制限が設けられていて、1週間でおおよそ300くらいの数の動画情報を取得すると制限かかっちゃいます、確か。

あまり推奨されていない(?)裏技としてはGCP内のプロジェクトを複数作成して、それらごとにAPIのキーを取得すれば、より多くの数の動画情報を取得できるようになりますが、Googleに目をつけられてアカウントがバンされる可能性とかあるかもなので、そこは自己責任でお願いします...。

手順2:Pythonスクリプトで動画情報をまとめたCSV取得

YouTubeAPIを利用するためのスクリプトは下記になります。
search関数を使うためにbuildを行います。

import pandas as pd
from apiclient.discovery import build
from apiclient.errors import HttpError
from tqdm import tqdm

t = open("./api.txt").readlines()
YOUTUBE_API_KEY = t[1]
youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
CHANNEL_ID = 'UCNdhTKY9QYzeVQGF2xtaHKQ'
channels = [] #チャンネル情報を格納する配列
searches = [] #videoidを格納する配列
videos = [] #各動画情報を格納する配列
nextPagetoken = None
nextpagetoken = None

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

次に動画URLを取得するためにスクリプトは下記になります。
orderをdateにすることで投稿日が新しい動画から取得します。
動画URLをsearchesという変数名のリストに格納していきます。

while True:
   if nextPagetoken != None:
       nextpagetoken = nextPagetoken
   search_response = youtube.search().list(
     part = "snippet",
     channelId = CHANNEL_ID,
     maxResults = 50,
     order = "date", #日付順にソート
     pageToken = nextpagetoken #再帰的に指定
     ).execute()

   for search_result in search_response.get("items", []):
       if search_result["id"]["kind"] == "youtube#video":
           searches.append(search_result["id"]["videoId"])
   try:
       nextPagetoken =  search_response["nextPageToken"]
   except:
       break
print("動画数", len(searches))

最後にsearchesリストをfor文で回して、get関数で動画情報をCSVに記載していきます。

col_list = ['id','title', 'description','tags','thumbnails','viewCount','likeCount','dislikeCount','commentCount','publishedAt']
video_info = pd.DataFrame(columns = col_list)
for result in tqdm(searches):
   video_response = youtube.videos().list(
     part = 'snippet,statistics',
     id = result
     ).execute()

   for video_result in video_response.get("items", []):
       if video_result["kind"] == "youtube#video":
#             videos.append([video_result["snippet"]["title"],video_result["statistics"]["viewCount"],video_result["statistics"]["likeCount"],video_result["statistics"]["dislikeCount"],video_result["statistics"]["commentCount"],video_result["snippet"]["publishedAt"]])
           try:
               tmp = pd.DataFrame(data=[[result, video_result["snippet"]["title"],video_result["snippet"]["description"],video_result["snippet"]["tags"],video_result["snippet"]["thumbnails"],video_result["statistics"]["viewCount"],video_result["statistics"]["likeCount"],video_result["statistics"]["dislikeCount"],video_result["statistics"]["commentCount"],video_result["snippet"]["publishedAt"]]],columns=col_list)
           except:
               tmp = pd.DataFrame(data=[[result, video_result["snippet"]["title"],video_result["snippet"]["description"],video_result["snippet"]["tags"],video_result["snippet"]["thumbnails"],video_result["statistics"]["viewCount"],video_result["statistics"]["likeCount"],video_result["statistics"]["dislikeCount"],None,video_result["snippet"]["publishedAt"]]],columns=col_list)
           video_info = video_info.append(tmp)


データフレームの列は、下記のcol_listになります。get関数で取得できる動画情報を殆ど格納します。
col_list = ['id','title','description','tags','thumbnails','viewCount','likeCount','dislikeCount','commentCount','publishedAt']
実際よく使うのは、id, title, description,publishedAtだと思います。
カウント値も使えそうですが、あくまでプログラム実行時のカウント値なので、情報が古くなっていってしまいます...。

手順3(追加):動画情報を一括で取得する方法

ここまでは最新動画を何百件か取得する方法をお伝えしていきました。
これでも割と多めの動画を取ってこれますが、動画数が多いチャンネルでは動画情報が全て欲しい!となった場合に目的を達成することはできません。
そのようなチャンネルで(漏れなく)全ての動画を取得する方法をお伝えしたいと思います。
私の方法では手作業で頑張る部分もありまして結構手間なのは否めません。より効率良い方法があれば共有いただけると幸いです笑笑

スクリプトは下記のようになります。

def change_month(gettime):
   st_split = gettime.split("-")
   if int(st_split[1])+1 >= 13:
       st_split[1] = "1"
       st_split[0] = str(int(st_split[0])+1)
   else:
       st_split[1] = str(int(st_split[1])+1)
   gettime = ("-").join(st_split)
   return gettime
   

API_KEY = t[1]
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
CHANNEL_ID = 'UCNdhTKY9QYzeVQGF2xtaHKQ'
channels = [] #チャンネル情報を格納する配列
searches = [] #videoidを格納する配列
videos = [] #各動画情報を格納する配列


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

starttime = '2019-9-01T00:00:00Z' # 動画を取得する期間を指定:期間の始め
endtime = '2019-10-01T00:00:00Z' # 動画を取得する期間を指定:期間の終わり

for i in range(12): # 1年間分の動画情報を取得するためにforで12回実行。実行終了の度にchange_month関数でstarttimeとendtimeの値を更新
   nextPagetoken = None

   print("starttime:", starttime)
   print("endtime:", endtime)

   while True:
       if nextPagetoken != None:
           nextpagetoken = nextPagetoken
       search_response = youtube.search().list(
         part = "snippet",
         channelId = CHANNEL_ID,
         maxResults = 75,
         order = "date", #日付順にソート
         pageToken = nextpagetoken, #再帰的に指定
         publishedAfter = starttime,
         publishedBefore = endtime
         ).execute()

       for search_result in search_response.get("items", []):
           if search_result["id"]["kind"] == "youtube#video":
               searches.append(search_result["id"]["videoId"])
       try:
           nextPagetoken =  search_response["nextPageToken"]
       except:
           break
   print("動画数", len(searches))

   starttime = change_month(starttime)
   endtime = change_month(endtime)

こんな感じになります!
ポイントを説明していきます。

ポイント1
starttimeとendtime変数で一ヶ月間の範囲を指定して、
その範囲内の動画はすべて取得するということを行っています。
ここで、勘の良い方は気づかれた方と思いますが、一ヶ月ごとに指定するのではなくて一番古い投稿日と最新の投稿日を指定すれば終わりじゃん!となりそうですが、APIの利用制限上それは✗です。
(動画数が少ない動画なら全期間指定でもOKだと思いますが、取得漏れが発生することがあるかもとのことですので、その点はお気をつけください...!)

ポイント2
中段にfor i in range(12):というコードがありますが、
これは何をやっているかというと、
1ヶ月分の動画を取得するプログラムを期間をずらして12回実施することで、1年分の動画を取得しています。
ここも利用制限に引っ掛からないようにforの回数は12にしました。

プログラムを実行するとコンソール表示は下記のようになるはずです。

starttime: 2019-9-01T00:00:00Z
endtime: 2019-10-01T00:00:00Z
動画数 0
starttime: 2019-10-01T00:00:00Z
endtime: 2019-11-01T00:00:00Z
動画数 232
starttime: 2019-11-01T00:00:00Z
endtime: 2019-12-01T00:00:00Z
動画数 241
starttime: 2019-12-01T00:00:00Z
endtime: 2020-1-01T00:00:00Z
動画数 258
starttime: 2020-1-01T00:00:00Z
endtime: 2020-2-01T00:00:00Z
動画数 274
starttime: 2020-2-01T00:00:00Z
endtime: 2020-3-01T00:00:00Z
動画数 292
starttime: 2020-3-01T00:00:00Z
endtime: 2020-4-01T00:00:00Z
動画数 305
starttime: 2020-4-01T00:00:00Z
endtime: 2020-5-01T00:00:00Z
動画数 320
starttime: 2020-5-01T00:00:00Z
endtime: 2020-6-01T00:00:00Z
動画数 332
starttime: 2020-6-01T00:00:00Z
endtime: 2020-7-01T00:00:00Z
動画数 345
starttime: 2020-7-01T00:00:00Z
endtime: 2020-8-01T00:00:00Z
動画数 359
starttime: 2020-8-01T00:00:00Z
endtime: 2020-9-01T00:00:00Z
動画数 371

これは2019年9月1日から2020年9月1日までで371件の動画情報を取得したよ!ということになります。

他の年のデータを取得する際は、starttimeとendtimeの値を人手で1年分ずらした値を入力し、再実行します。(めんどくせぇ…)

ポイント3
最後にAPI利用制限がある中でたくさんの動画を取得するための方法(裏技?)についておつたえします。(手順1の後半でサラッとお伝えした内容にリンクします)
私の体感では一つのAPIキーで1週間につき300件ほどの動画は取得できたと思います。ので、1200件ほど動画があるチャンネルでは、4週間かかります。
4週間かけてすべての動画情報を取得するのもいいですが、そんなに待っていられん!という方は、GCPのプロジェクトを複数立ち上げて、各々でAPIキーを作成すれば動画数が多いチャンネルの動画情報もそこまで時間をかけずに取得することができます。1200件の動画については4プロジェクト立ち上げればOKということです。
ただGoogleに目をつけられてアカウントがバンされる可能性もあるかもですが、、、

CSVの中身をチェック

CSVのサンプルを共有します。この形式で情報を保存することができます。

私の方で、取得した2021年7月30日までのすべての動画情報をまとめたCSVを作成しました。
中身を確認してみたところ、一番人気な動画はこれでした↓
(YouTube側からも確認できますが,,,)

最後に

おさらいです。
今回はYouTubeAPIとPythonを用いて、特定チャンネルの動画を取得することにチャレンジしてみました!手順通りに進めればCSV形式で動画情報をまとめることができるようになると思います。怪しい方法ですが、動画数が多いチャンネルでも動画を取得できる方法もお伝えいたしました。

今回作成したCSVですが、色々と使いみちはあると思います。
例えば、お気に入りのチャンネルの動画を取得して、埋もれていた動画をチェックしたり、いちばん人気な動画やコメント数が多い動画を確認したりできるようになります!これが楽しかったりします笑
あと私はオードリーのYouTube動画を紹介するサイトを作成しているのですが、そこでオドぜひ用の記事を作成する際に自作CSVを参考にしています。サイトはここ↓

今回は以上になります!参考になれば幸いです!
ではでは👍

(クソダサヘッダーを卒業せねば、、、)

-----------------------------------------------------------------------------

【自己紹介】
IT系のことをメインに呟きます。初心者です。
PythonとかWordPressネタとかが多いと思います。
オードリーの動画まとめサイト(https://matome-odozehi.com)を運営しています。日々開発中。

Twitterもやってます ⇛ https://twitter.com/pipotteru
作曲用のアカウントはコチラ ⇛ https://twitter.com/tterusic

-----------------------------------------------------------------------------

この記事が気に入ったらサポートをしてみませんか?