PR
Python

SpotifyのAPIを使って各国TOPチャート200曲データを入手する方法とは?

Python
スポンサーリンク

この記事は、こんな方におすすめです。
  • Spotifyの簡単APIで曲のデータを入手したい方
  • Pythonの初学者で、glob関数でファイルの結合をしたい方
  • 世界で流行っている音楽に興味がある方
スポンサーリンク

はじめに

 ご訪問いただきありがとうございます。本記事ではSpotifyのAPIを利用しPythonで音楽のデータを入手していく操作方法について解説していきます。Spotifyの音楽データにご興味のある方のご参考になればと思います。この操作を通じてPythonの基本的な使い方もいっしょに開設していきます。それではいってみましょう。世界中のユーザーは、どんな音楽に夢中になっているんでしょうね。

なお、Pythonを中高年が基礎から最速独学で学ぶ方法を別の記事でまとめていますので、よろしければご覧ください。>> 中高年の為の挫折しない最短のPython,AI・機械学習のおすすめ学習方法
>> 中高年がAI・機械学習を学ぶ為のプログラミングスクール 主要8校を徹底比較

スポンサーリンク

手順

  1. Spotify charts からお好きな国のTOPチャート200をダウンロード
  2. Spotify for Developperからclient_idとclient_secretを入手
  3. PythonでSpotify APIを通して詳細データを入手
  4. 各国データを統合する
スポンサーリンク

1.Spotify charts からお好きな国のTOPチャート200をダウンロードする方法

Spotify Charts - Spotify Charts are made by fans
The new home for Spotify Charts. Dive into artist, genre, city and local pulse charts to see what music is moving fans around the world.

チャート画面では①のGLOBALのボタンからFilter機能で国、その右側のボタンでDAILY or WEEKLY、さらにその右側には日付のボタンがありますので(2017/1/1からあります)確認したい日付を選択します。TOP200は 、最もストリーミング再生された曲をランク付けしたものVIRAL50は、ストリーミング再生やリスナーのシェア数を分析してランク付けしたもので、純粋にファンが聴いて共感共有した音楽のデータになります。ここでは、TOP200のデータを入手していきます。

Spotifyの音楽チャートの画面です。任意の国、期間を指定してデータをダウンロードできます。
Spotifyの音楽チャートの画面
グローバルのスクロールを開いた画面です。日本もありますね。
グローバルのスクロールを開いた画面

②の画面右上の「DOWNLOAD TO CSV」をクリックすると下図が現れダウンロードが開始されます

ダウロード中の画面
ダウロード中の画面

以下はダウンロードされたCSVファイルの中身です。には、Position(順位)、Track Name(曲名)、Artist(アーティスト名)、streams(ストリーミング回数)、URL(ここが重要!曲の情報が詰まっています)の情報が入っています。

ダウンロードされたCSVファイルの中身
ダウンロードされたCSVファイルの中身

2.Spotify for Developerからclient_idとclient_secretを入手する方法

さきほどダウンロードしたリストからURLをキーとして曲の情報を得るためには、client_idとclient_secretが必要になりますので、まずはSpotify Developerのページに入ります。

Home | Spotify for Developers

画面上ヘッダーにあるDASHBOARDをクリックします。

Spotifyのデベロッパー用のTOP画面です。
Spotifyのデベロッパー用のTOP画面

初めての方は、下図の矢印のSign up for a free Spotify account here. をクリックします。

個人的に作成したデベロッパー画面です。
個人的に作成したデベロッパー画面

すると下図のような画面になります。わたしはすでに「mahara」というAppを作成していますが、初めての方の場合には何もありませんので、矢印のCREATE AN APPをクリックし新しいAppをつくります。

自分のダッシュボードの中身です。
自分のダッシュボードの中身

CREATE AN APPの画面では①App nameに任意の名前を入力します。そして ②の App description に作成しようとしているAppが何であるか説明を入力します。ただ今回の場合はAppをつくることが目的ではないので”test”と入力します。そして③にチェックを入れ、④のCREATEボタンをクリックします。

個人のAppを作成する手順です。
個人のAppを作成する手順

すると、DASHBOARD画面では、矢印の通りClient_IDClient Secret が現れます。このデータがこの後の情報を入手するために必要なものになります。
デフォルト画面ではClient Secretは隠れているので「SHOW CLIENT SECRET」をクリックすると現れますよ

自分に割り当てられたClient IDとClient Secretを確認できる画面です。
自分に割り当てられたClient IDとClient Secretを確認できる画面

3.PythonでSpotify APIを通して詳細データを入手する方法

つづいていよいよ、URLをキーとして一番最初に入手した曲の詳細情報を入手していきます。準備として、Pythonのライブラリ「spotipy」をインストールしておきましょう。間違ってspotifyと入力しないようにね。私は間違えてしまいました。パイですよパイ。

pip install spotipy

初めに、あらかじめ入手しておいたclient_id,client_secretをコード中の****に入力してspotifyのデータにアクセスできるようにします。

import pandas as pd
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import json

client_id = '************************************' # あらかじめ入手したclient_id
client_secret = '********************************' # あらかじめ入手したclient_secret
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

1.で入手したTOP200データを読み込みます

songs = pd.read_csv("regional-jp-daily-latest.csv",header=1)
songs.head()
日本の上位5曲リスト
日本の上位5曲リスト

上記で入手したデータ中にあるURLデータを元に曲の詳細情報を入手しsong_infoに格納します。

song_infoという空の箱を用意しておきます。そしてfor文で曲ごとのURLから特徴を取り出しsong_infoに格納していきます。

song_info = pd.DataFrame()

for url in songs["URL"] :
    df = pd.DataFrame.from_dict(spotify.audio_features(url))
    song_info = song_info.append(df)
song_info.head()

song_info=song_info.reset_index(drop=True)
song_info.head()

idやuriなど解析に不要なものは削除しておきます。

song_info = song_info.drop(["id","uri","track_href","analysis_url"],axis=1)

1.で入手した曲の基本データと2.で入手したsong_infoの詳細データを合体させて一つのファイルとします。

pd.concat([songs, song_info], axis=1).to_csv("songs_jp_top200.csv")

国別に解析を進めたいので、国名の列を追加しcsvファイルに落とし込みます。

songs_200 = pd.read_csv("songs_jp_top200.csv")
songs_200["C"] = "JP"
songs_200.to_csv("songs_jp_top200.csv")

4.各国データを統合する方法

glob関数を使ってファイルを簡単に結合していきます。一つ一つを結合するとなると相当大変な作業になりますが、glob関数を用いることで簡単に複数のファイルを結合することができます。まずは必要なライブラリをインポートします。globは引数に指定されたパターンに合うファイルパス名を取得することができます。

import pandas as pd
import glob

あらかじめ3で入手したデータを格納したフォルダを用意しておき、そのファイルを下記コードで合体させていきます。一つ一つ結合するのも手間ですので非常に便利ですよね。

# パスで指定したファイルの一覧をリスト形式で取得. (ここでは各国top200フォルダ内)
csv_files = glob.glob('各国top200/*.csv')

#読み込むファイルのリストを表示
for a in csv_files:
    print(a)

#csvファイルの中身を追加していくリストを用意
data_list = []

#読み込むファイルのリストを走査
for file in csv_files:
    data_list.append(pd.read_csv(file))

#リストを全て行方向に結合
#axis=0:行方向に結合, sort
df = pd.concat(data_list, axis=0, sort=True)

df.to_csv("各国top200/world_top200.csv",index=False)

ちなみに私は28か国のデータを入手して、world_top200.csvにまとめてみましたよ♪
コード中にあるsongs_○○_top200.csvの○○に各国の略号が入っています。

各国top200\songs_ar_top200.csv
各国top200\songs_at_top200.csv
各国top200\songs_au_top200.csv
各国top200\songs_be_top200.csv
各国top200\songs_br_top200.csv
各国top200\songs_cl_top200.csv
各国top200\songs_cr_top200.csv
各国top200\songs_de_top200.csv
各国top200\songs_eg_top200.csv
各国top200\songs_es_top200.csv
各国top200\songs_fr_top200.csv
各国top200\songs_hk_top200.csv
各国top200\songs_il_top200.csv
各国top200\songs_in_top200.csv
各国top200\songs_it_top200.csv
各国top200\songs_jp_top200.csv
各国top200\songs_kr_top200.csv
各国top200\songs_mx_top200.csv
各国top200\songs_nl_top200.csv
各国top200\songs_no_top200.csv
各国top200\songs_pt_top200.csv
各国top200\songs_ru_top200.csv
各国top200\songs_sa_top200.csv
各国top200\songs_se_top200.csv
各国top200\songs_tw_top200.csv
各国top200\songs_uk_top200.csv
各国top200\songs_usa_top200.csv
各国top200\songs_za_top200.csv

以下が入手したデータの一部になります。無事にsong_infoのデータが結合され28ヶ国のTOPチャート200曲の詳細情報を入手することが出来ました。

ArtistCPositionStreamsTrack NameURLUnnamed: 0Unnamed: 0.1acousticnessdanceabilityduration_msenergyinstrumentalnesskeylivenessloudnessmodespeechinesstempotime_signaturetypevalence
Tiago PZKAR1577239Entre Nosotroshttps://open.spotify.com/track/6w8yBI2vthyN9UnwO4UBWb000.4940.7291923530.5131.10E-0650.137-6.34500.0455170.0643audio_features0.789
EmiliaAR2574043Como Si No Importarahttps://open.spotify.com/track/1GYJpuLq41vEVKXiHGEY9j110.4670.8431730530.534010.0984-6.65800.14294.9844audio_features0.528
BANDIDOAR3518619No Me Conocen (Remix) [con DUKI, Rei & Tiago PZK]https://open.spotify.com/track/7COGuXyTr12KvdaYXMqheC220.2810.7692802740.8122.63E-0510.0781-2.08800.0825180.0034audio_features0.926
MYAAR44863282:50 Remixhttps://open.spotify.com/track/74znaWw1hmQBusGPSOuTFy330.1120.8182317080.812090.234-4.42510.0475139.9664audio_features0.844
J BalvinAR5458941Quテゥ Mテ。s Pues?https://open.spotify.com/track/6hf0RpxTbOprT5nnwzkk8e440.02610.8912177730.8190.00035480.173-3.96410.106101.9684audio_features0.768
BizarrapAR6433608Nicky Jam: Bzrp Music Sessions, Vol. 41https://open.spotify.com/track/03LfOYi0icz4souspZVVhq550.09130.6271580870.849010.145-3.16700.15389.9074audio_features0.818
Rauw AlejandroAR7389363Todo De Tihttps://open.spotify.com/track/5RwV8BvLfX5injfqYodke9660.3020.781996040.7190.00019630.0931-3.61300.0506127.9624audio_features0.336
TINIAR8354217Miテゥntemehttps://open.spotify.com/track/0cOa970mzTWAxKtltpkpLc770.1610.851652750.5415.01E-0620.286-4.52210.067492.0034audio_features0.916
Bad BunnyAR9348454Yonagunihttps://open.spotify.com/track/2JPLbjOn0wPCngEot2STUS880.2760.6442067100.648010.135-4.60110.118179.9514audio_features0.44
Nio GarciaAR10301738AM Remixhttps://open.spotify.com/track/05bfbizlM5AX6Mf1RRyMho990.1140.7432613350.655060.0764-5.01500.159172.0314audio_features0.785
RusherkingAR11275624Bailando Te Conocテュhttps://open.spotify.com/track/0vvuIsoJ101Hme1VIXBIEi10100.03920.8481944000.622070.0879-3.65210.062599.9724audio_features0.558
Maria BecerraAR12274918Cazamehttps://open.spotify.com/track/2LtTHIXTaFwvY9oLOThElU11110.1430.5831995920.4580.0059900.107-6.89110.16698.0134audio_features0.295

入手した詳細情報とはいったい何がはいっているのでしょうか、入手できる情報は次のとおりです。これらを分析することで独自の解析ができそうですね。

特徴意味説明
acousticnessアコースティック感0.0~1.0までの指標で値が大きいほどアコースティック感が強いということになります
danceabilityダンスしやすさリズムやテンポからダンスがしやすいかどうかを表しています
0.0~1.0までの指標で、値が大きいほどダンスがしやすい曲になります
duration_ms演奏時間曲の長さ
energyエネルギッシュ感0.0~1.0までの指標で値が大きいほど、エネルギーがあると判断されています。
instrumentalnessインスト感0.0~1.0までの指標で楽器中心の音楽、いわゆるボーカルが含まれていない楽曲は値が大きくなります。
key曲のキー0 = C、1 = C♯/D♭、2 = D …11=Bを0~11で表したもの
livenessライブ感オーディエンスの存在を検出します。数値が高いほどライブで演奏された可能性が高いことを表します。0.8 より大きい値は、ライブである可能性が高くなります
loudness音圧値は曲全体で平均化され、相対的な音圧を比較するのに役立ちます。値の範囲は -60 ~ 0 db です。音圧が大きいほどマイナス側になります
modeメジャーかマイナーか1がメジャー、0がマイナーの曲になります
speechinessスピーチ感例えば、トークショー、オーディオブック、詩などは、1.0に近くなります。 の値は、ラップ などは、0.33 ~ 0.66になります
tempo曲のテンポBPM。高いほど曲のテンポが速くなります
time_signature拍子4/4拍子なら4になる
valence曲の明るさ0.0~1.0までの指標で値が大きいほど幸せ、陽気、陶酔などのポジティブな印象で小さいほど悲しみ、落ち込み、怒りなどのネガティブな印象になります

まとめ

最後まで読んでいただきありがとうございました。Pythonを使ったSpotifyからのデータの入手方法はご理解いただけたかと思います。みなさんもお好きなアーティストの情報をみたり、外国の音楽シーンをみたりするとおもしろいですよ。またPythonで複数のファイルを結合するglob関数も扱いましたが業務でも使えるテクニックですのでどしどし使っていきましょう。今回の記事が少しでも皆さんの業務のお役に立てられれば幸いです。

次はこのデータを使って各国の音楽性の違い、好みなどを探っていきたいと思います。

普段、まったく聞くことのないようなアフリカとか中東なんかの音楽シーンもどのような特徴があるのか気になるよね♪

コメント

タイトルとURLをコピーしました