Spotify Web APIから分析用データセットをつくる

4 min read読了の目安(約4400字

概要

音楽ストリーミングサービスSpotifyが提供しているWebAPIから、データを取得する方法をまとめました。Colabでソースコードを順にコピペし実行していけば、手軽に、数百曲のデータセットを、csvファイルで取得できます。もちろん曲数を増やすことも簡単にできます。

SpotifyのWebAPIとは

ディベロッパー登録をして、Client IDとClient Secretを取得することで、Spotifyが持っている楽曲に関するデータ(曲名、アルバム名、アーティスト名、リリース日、曲の長さ、テンポなど)を取得することができます。danceability(ダンス度)やacousticness(アコースティック度)など、楽曲の特徴が指標化されているのも、面白いところです。
今回は、Spotifyの公開プレイリスト(特定のテーマで集められた曲リスト)を指定し、プレイリストに含まれる楽曲のIDリストから、さらに楽曲ごとのデータを取得しにいきます。

SpotifyにDeveloper登録

https://developer.spotify.com/dashboard/
こちらのページの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

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)

楽曲ごとのデータを取得

取得できるデータの詳細は、本家のドキュメントを参照。

https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-features/
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の指標によらない音楽自体の分析結果など、別の要素との組み合わせによる発見も、あるかもしれません。