Spotify Web APIから分析用データセットをつくる
概要
音楽ストリーミングサービスSpotifyが提供しているWebAPIから、データを取得する方法をまとめました。Colabでソースコードを順にコピペし実行していけば、手軽に、数百曲のデータセットを、csvファイルで取得できます。もちろん曲数を増やすことも簡単にできます。
SpotifyのWebAPIとは
ディベロッパー登録をして、Client IDとClient Secretを取得することで、Spotifyが持っている楽曲に関するデータ(曲名、アルバム名、アーティスト名、リリース日、曲の長さ、テンポなど)を取得することができます。danceability(ダンス度)やacousticness(アコースティック度)など、楽曲の特徴が指標化されているのも、面白いところです。
今回は、Spotifyの公開プレイリスト(特定のテーマで集められた曲リスト)を指定し、プレイリストに含まれる楽曲のIDリストから、さらに楽曲ごとのデータを取得しにいきます。
SpotifyにDeveloper登録
こちらのページのSign upから登録を行い、APPを作成して、Client IDとClient Secretを取得します。
# colabの環境にspotipyをインストール
!pip install spotipy
import pandas as pd
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import time
# spotify developerから取得したclient_idとclient_secretを入力
client_id = '*************'
client_secret = '*************'
client_credentials_manager = SpotifyClientCredentials(client_id, client_secret)
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
プレイリストのIDを取得
取得したいプレイリストのIDを用意します。プレイリストのURLの、最後のスラッシュのあとが、プレイリストのIDになっています。下記例だと 4vFZ21t84EEfWkl7HGa926 がIDになります。
https://open.spotify.com/playlist/4vFZ21t84EEfWkl7HGa926
"SpotifyのプレイリストのIDを入力"の箇所にIDを入力すると、複数のプレイリストも一気に取得できます。
プレイリストの楽曲取得は、1度に100曲が上限となっています。100曲以上含まれているリストを取得する際は、playlist['tracks']['next'] を見て、繰り返しアクセスして取得します。曲数の多いプレイリストを使った際に、地味にハマったポイントでした。また、多くのデータを集めようとすると楽曲の重複も出てくるので、重複は除くようにしておきます。
def getTrackIDs(playlist_ids):
track_ids = []
for playlist_id in playlist_ids:
playlist = sp.playlist(playlist_id)
while playlist['tracks']['next']:
for item in playlist['tracks']['items']:
track = item['track']
if not track['id'] in track_ids:
track_ids.append(track['id'])
playlist['tracks'] = sp.next(playlist['tracks'])
else:
for item in playlist['tracks']['items']:
track = item['track']
if not track['id'] in track_ids:
track_ids.append(track['id'])
return track_ids
playlist_ids = ['4vFZ21t84EEfWkl7HGa926', '1qOIDkEQX5ee2zxsGVxejg'] # SpotifyのプレイリストのIDを入力
track_ids = getTrackIDs(playlist_ids)
print(len(track_ids))
print(track_ids)
楽曲ごとのデータを取得
取得できるデータの詳細は、本家のドキュメントを参照。
def getTrackFeatures(id):
meta = sp.track(id)
features = sp.audio_features(id)
name = meta['name']
album = meta['album']['name']
artist = meta['album']['artists'][0]['name']
release_date = meta['album']['release_date']
length = meta['duration_ms']
popularity = meta['popularity']
key = features[0]['key']
mode = features[0]['mode']
danceability = features[0]['danceability']
acousticness = features[0]['acousticness']
energy = features[0]['energy']
instrumentalness = features[0]['instrumentalness']
liveness = features[0]['liveness']
loudness = features[0]['loudness']
speechiness = features[0]['speechiness']
tempo = features[0]['tempo']
time_signature = features[0]['time_signature']
valence = features[0]['valence']
track = [name, album, artist, release_date, length, popularity, key, mode, danceability, acousticness, energy, instrumentalness, liveness, loudness, speechiness, tempo, time_signature, valence]
return track
track_idsに入った楽曲のデータを、1曲1曲取得していくため、曲数によっては時間がかかります。よほど曲数が多い場合はAPIアクセスに制限がかかる可能性があることも頭に入れておきます。
tracks = []
for track_id in track_ids:
time.sleep(0.5)
track = getTrackFeatures(track_id)
tracks.append(track)
df = pd.DataFrame(tracks, columns = ['name', 'album', 'artist', 'release_date', 'length', 'popularity', 'key', 'mode', 'danceability', 'acousticness', 'energy', 'instrumentalness', 'liveness', 'loudness', 'speechiness', 'tempo', 'time_signature', 'valence'])
df.head()
こんな感じでデータを取得することができます。
CSVでデータセットをダウンロード
csvファイルとしてダウンロードします。
df.to_csv('spotify_music_data.csv', sep = ',')
from google.colab import files
files.download('spotify_music_data.csv')
データがダウンロードできたら...
ヒット曲の傾向を分析したり、ジャンルやアーティストの分類について考察してみたり、独自にフラグを立てて予測に使うといったこともできるでしょう。もちろん、どういったプレイリストからデータを集めてくるかが影響するため、ケースに合ったプレイリストを探す必要があります。歌詞の特徴や、Spotifyの指標によらない音楽自体の分析結果など、別の要素との組み合わせによる発見も、あるかもしれません。
Discussion