LoginSignup
9

More than 3 years have passed since last update.

一つのYoutubeチャンネルから再生回数TOP10を一括ダウンロード

Last updated at Posted at 2020-01-10

Qiitaへの初投稿です。
基本的に私の備忘録も兼ねて使う予定です。
まだPython勉強中なのでコードに関して突っ込みなどあればご指摘お願いします。

また、著作権などに関しては私的使用の範囲であれば可能という認識ですが、何か問題があった場合は指摘してください。

下準備

まずは、https://console.cloud.google.com/にアクセスしてプロジェクト作成、ライブラリからYoutube Data APIを有効化、認証情報(APIKey)の追加。

次に、Youtube Data APIを使うにあたって必要になるライブラリのインストール、動画の保存に当たって必要になるYoutube_DLのインストール。

pip install google-api-python-client
pip install youtube-dl

コード

インストールできたら、まずライブラリのインポートと各変数への代入です。

from apiclient import discovery
import youtube_dl

DEVELOPER_KEY = "" # ここにAPIKey
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
ydl_opts = {
   'format': 'bestaudio/best',
   'postprocessors': [
       {'key': 'FFmpegExtractAudio',
       'preferredcodec': 'mp3',
        'preferredquality': '192'},
       {'key': 'FFmpegMetadata'},
   ],
} # youtube-dlでダウンロードする動画を音楽に変換する

もし音楽ではなく動画をダウンロードしたい場合はytdl_optsを空にすればOKです。

次に、チャンネルで最も多く再生されている動画のURLを0-10まで取得。

def youtube_search(channelId):
 videos = [] # URLを入れるリスト
 youtube = discovery.build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
   developerKey=DEVELOPER_KEY)

 search_response = youtube.search().list(
   part="snippet",
   channelId= channelId,
   maxResults=10,
   order="viewCount",
 ).execute() # APIでチャンネルを指定したうえで再生回数順に10件動画検索をかける

 for search_result in search_response.get("items", []):
   if search_result["id"]["kind"] == "youtube#video":
     print("https://www.youtube.com/watch?v=" + search_result['id']['videoId'])
     videos.append(search_result["id"]["videoId"]) # videosにURL追加

 return videos

ちなみに検索数はmaxResults=0-50まで任意で指定できます。

最後にリストに入っているURLの動画すべてをダウンロード

def download_video(video_list):
 for i, videoId in enumerate(video_list): # インデックス番号と要素を同時に回す
   # ydl_opts['outtmpl'] = "music{}".format(str(i)) + '.%(ext)s' # もし再生回数順ををわかりやすくしたい場合はここの#を外せばmusic0-10.mp3(mp4)としてダウンロードできます
   ydl = youtube_dl.YoutubeDL(ydl_opts)
   ydl.extract_info("https://www.youtube.com/watch?v={}".format(videoId), download=True)

# ytdl_opts=...の部分はファイル名の形式を表しています。

#を消せばmusic[0-10].mp3(mp4)の形式でダウンロードできます。

最後

そのままコード実行して使える形

from apiclient import discovery
import youtube_dl

DEVELOPER_KEY = "YOUR_API_KEY" # ここにAPIKeyを入れてください
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
ydl_opts = {
   'format': 'bestaudio/best',
   'postprocessors': [
       {'key': 'FFmpegExtractAudio',
       'preferredcodec': 'mp3',
        'preferredquality': '192'},
       {'key': 'FFmpegMetadata'},
   ],
} # youtube-dlでダウンロードする動画を音楽に変換する

def youtube_search(channelId):
 videos = [] # URLを入れるリスト
 youtube = discovery.build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
   developerKey=DEVELOPER_KEY)

 search_response = youtube.search().list(
   part="snippet",
   channelId= channelId,
   maxResults=10,
   order="viewCount",
 ).execute() # APIでチャンネルを指定したうえで再生回数順に10件動画検索をかける

 for search_result in search_response.get("items", []):
   if search_result["id"]["kind"] == "youtube#video":
     print("https://www.youtube.com/watch?v=" + search_result['id']['videoId'])
     videos.append(search_result["id"]["videoId"]) # videosにURL追加

 return videos

def download_video(video_list):
 for i, videoId in enumerate(video_list): # インデックス番号と要素を同時に回す
   # ydl_opts['outtmpl'] = "music{}".format(str(i)) + '.%(ext)s' # もし各動画の再生回数順をわかりやすくしたい場合はここの#を外せばmusic0-10.mp3としてダウンロードできます
   ydl = youtube_dl.YoutubeDL(ydl_opts)
   ydl.extract_info("https://www.youtube.com/watch?v={}".format(videoId), download=True)

if __name__ == '__main__':
 channel = input("チャンネルIDを入力してください:")
 videos = youtube_search(channel)
 download_video(videos)
 print('ダウンロードが完了しました。')

この記事はここまでです。ありがとうございました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9