YouTube Data APIから得た情報からサムネイル画像をダウンロードする
YouTube Data API を使ってキーワード検索から動画の再生回数等の情報を取得します.
全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】
# YouTube Data APとは
YouTubeが提供しているAPIで、動画やチャンネル、再生リストに関わる情報を取得して、自分のWebサイトやアプリケーションで使用することができます。
公式のドキュメントが用意されているので、詳しくはこちらをご覧ください。
https://developers.google.com/youtube/v3/getting-started?hl=ja
引用元:YouTube Data API v3を使用して、YouTubeページと同じリストモジュールを作ってみた (opens new window)
YouTube が提供している API で、動画やチャンネルなど情報を取得して、自分の Web サイトやアプリケーションで使用することができます。
一日あたりのAPI使用量(クォータ)の上限が10000になっているので、注意して使用してください。
引用元:【Python】YouTube Data API を使って、いろんな情報を取得してみた! (opens new window)
# モジュールのインストール
!pip install google-api-python-client
# youtubeの情報を取得(複数の動画)
特定のキーワードで検索かけて,複数の動画の情報を取得します.
最終的には,DataFrameで出力します.
ここでは,以下の情報を取得します.
- video_id
- タイトル
- クレイピング日時
- 動画の公開日時
- チャンネルタイトル
- チャンネルID
- 概要欄
- サムネイル
# youtubeの情報をDataFrame形式で取得(前回と一緒)
ここでは,特定キーワードを含むタイトルの動画を再生回数順でDataFrame形式で取得します.
また,任意の動画数分だけ取得できるようにもしています.
import datetime
import pandas as pd
from apiclient.discovery import build
#numに入れた数字×5件の情報を取得
##その他のパラメーターはAPIから情報を取得するパラメータと同じ
# 動画のタイトル等を抜粋()
def get_video_info(part, q, order, type, num):
dic_list = []
search_response = youtube.search().list(part=part,q=q,order=order,type=type)
output = youtube.search().list(part=part,q=q,order=order,type=type).execute()
#一度に5件しか取得できないため何度も繰り返して実行
for i in range(num):
dic_list = dic_list + output['items']
search_response = youtube.search().list_next(search_response, output)
output = search_response.execute()
df = pd.DataFrame(dic_list)
#各動画毎に一意のvideoIdを取得
df1 = pd.DataFrame(list(df['id']))['videoId']
#各動画毎に一意のvideoIdを取得必要な動画情報だけ取得
df2 = pd.DataFrame(list(df['snippet']))[['channelTitle','publishedAt','channelId','title','description','thumbnails']]
ddf = pd.concat([df1,df2], axis = 1)
# 日本時刻に修正+9hours
ddf['publishedAt'] = pd.to_datetime(ddf['publishedAt']) + datetime.timedelta(hours=9)
return ddf
# 再生回数等の情報を取得
上記のタイトル情報を整理したDataFrameに再生回数等の情報を追記します.
- 再生回数
- good数
- Bad数
- コメント数
#videoIdを入力することで、その動画の具体的な再生回数やいいね数を取得する関数を作成
def get_statistics(id):
statistics = youtube.videos().list(part = 'statistics', id = id).execute()['items'][0]['statistics']
return statistics
def make_video_dataframe(q, order, _type, num):
# 動画情報の取得
df_snippet = get_video_info(part='snippet',q=q,order=order,type=_type,num = num)
# 動画の再生回数等を取得
df_static = pd.DataFrame(list(df_snippet['videoId'].apply(lambda x : get_statistics(x))))
# データフレームの結合
df_output = pd.concat([df_snippet,df_static], axis = 1)
# スクレイピング日時を入力
scrape_date = str(datetime.date.today()).replace('-','')
df_output['scrape_date'] = scrape_date
# 日本時刻に修正+9hours
df_output['publishedAt'] = pd.to_datetime(df_output['publishedAt']) + datetime.timedelta(hours=9)
return df_output
# コードの実行
以下のコードで実行します.
# 引数
part='snippet'
q = 'ボードゲーム'
order = 'viewCount'
_type = 'video'
num = 10 #Max:75/day->75*5=375本/day
# APIの取得
YOUTUBE_API_KEY = 'AIzaSyCjNsPtyaDBn0_mOW0DbxNhU9BxkCrqPAs'
youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
# 情報をデータフレーム形式で取得
df_youtube = make_video_dataframe(q, order, _type, num)
display(df_youtube.head())
# csvに出力
df_youtube.to_csv('BoardGame_scape.csv', index=False)
videoId | channelTitle | publishedAt | channelId | title | description | thumbnails | viewCount | likeCount | dislikeCount | favoriteCount | commentCount | scrape_date | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | ASusE5qjoAg | 東海オンエア | 2019-05-31T11:58:15Z | UCutJqz56653xV2wwSvut_hQ | 【目指せ商品化】文理対抗!ガチンコボードゲーム作り対決! | 東海オンエアってもう「チャンネル登録してください」とか「高評価よろしくお願いします」とか言わ... | {'default': {'url': 'https://i.ytimg.com/vi/AS... | 4931938 | 127705 | 1871 | 0 | 4432 | 20210621 |
1 | GzPq9KfVIj8 | 東海オンエア | 2019-06-01T10:40:40Z | UCutJqz56653xV2wwSvut_hQ | 【理系編】文理対抗!ガチンコボードゲーム作り対決! | 語尾が戻ってきました。うれしいです。 「だってばよ」時代は、概要欄も一言くらいにとどめていた... | {'default': {'url': 'https://i.ytimg.com/vi/Gz... | 4828320 | 180977 | 1573 | 0 | 5013 | 20210621 |
2 | SgZzIrugEnU | すごろくや公式チャンネル | 2019-10-03T15:59:53Z | UC-eApqGqN0N_S2s2ARJgt-A | すごろくやCM「ボードゲーム、おうちでやろう。」編 | Credits: Director : 清水貴栄 (DRAWING AND MANUAL) ... | {'default': {'url': 'https://i.ytimg.com/vi/Sg... | 2717738 | 102 | 12 | 0 | 2 | 20210621 |
3 | BNv7zbORfVM | ジャニーズJr.チャンネル | 2019-08-07T12:45:00Z | UC1cHlPIE-kqiPvpyYz2O8rQ | Snow Man 【ボードゲーム】ベストアクトで演技力対決してみた! | どうもSnow Manです! 今回はボードゲームをやりまぁす。挑戦したゲームは、演技力が試さ... | {'default': {'url': 'https://i.ytimg.com/vi/BN... | 2689251 | NaN | NaN | 0 | 3639 | 20210621 |
4 | 1y4_v6PnsOE | Snow Man | 2020-05-13T10:30:00Z | UCuFPaemAaMR8R5cHzjy23dQ | Snow Man「リモートでボードゲームに挑戦」みんな顔が黒くなった! | 2年ぶりにあのゲームをやってみました。 しかもリモートスタイルで! するとみんな...とんで... | {'default': {'url': 'https://i.ytimg.com/vi/1y... | 2414531 | NaN | NaN | 0 | 8896 | 20210621 |
# サムネイル画像のダウンロード
出力したcsvからサムネイル画像をダウンロードします.
import os
import pprint
import time
import urllib.error
import urllib.request
import json
def download_file(url, dst_path):
try:
with urllib.request.urlopen(url) as web_file:
data = web_file.read()
with open(dst_path, mode='wb') as local_file:
local_file.write(data)
except urllib.error.URLError as e:
print(e)
下記のコードで実行します.
import pandas as pd
# csvの入力
df_scrape = pd.read_csv('BoardGame_scape.csv')
os.makedirs('./thumbnails', exist_ok=True)
# サムネ画像のDL
for idx in range(len(df_scrape)):
# URLの取得
thumbnail_url = json.loads(df_scrape['thumbnails'][idx].replace("'", '"'))['high']['url']
# 保存先
save_path = './thumbnails/{}.jpg'.format(df_scrape['videoId'][idx])
# サムネ画像のDL
download_file(thumbnail_url, save_path)
# 参考サイト
【Python】YouTube Data API を使って、いろんな情報を取得してみた! (opens new window)
YouTube Data API v3を使用して、YouTubeページと同じリストモジュールを作ってみた (opens new window)
Youtube Data APIを使ってPythonでYoutubeデータを取得する (opens new window)
Search: list | YouTube Data API | Google Developers (opens new window)