PythonでSpotify APIを使って1970年から2021年までの楽曲情報を抽出しDBに格納します.
Spotify APIの導入
Spotify APIの導入は下記のサイトを参考にしてください.
()
楽曲情報の抽出
楽曲情報の抽出は下記のサイトを参考にしてください.
()
DBの作成
本稿では,下記のDBを作成します.
- info_table:楽曲情報を格納
- feature_table:楽曲特徴を格納
info_tableの作成
下記のコードでinfo_tableを作成します.
python
import sqlite3
# dbの読み込み(sample.dbは自動で作成される)
con = sqlite3.connect('spotify_music.db')
# カーソルの設定
# https://www.postgresql.jp/document/9.2/html/plpgsql-cursors.html
cur = con.cursor()
# テーブル1:info_table(楽曲の情報)の作成
# テーブル名 データ型 unique : 重複禁止のカラム作成
cur.execute('''CREATE TABLE info_table
(track_id text unique,
name text,
album text,
artist text,
release_date date,
country text,
length int,
popularity int)
''')
# テーブル変更を保存
con.commit()
# dbとカーソルを閉じる
cur.close()
con.close()
feature_tableの作成
下記のコードでfeature_tableを作成します.
python
import sqlite3
# dbの読み込み(sample.dbは自動で作成される)
con = sqlite3.connect('spotify_music.db')
# カーソルの設定
# https://www.postgresql.jp/document/9.2/html/plpgsql-cursors.html
cur = con.cursor()
# テーブル2:feature_table(楽曲の特徴情報)の作成
# テーブル名 データ型 unique : 重複禁止のカラム作成
cur.execute('''CREATE TABLE feature_table
(track_id text unique,
key int,
mode int,
danceability float,
acousticness float,
energy float,
instrumentalness float,
liveness float,
loudness float,
speechiness float,
tempo float,
time_signature int,
valence float)
''')
# テーブル変更を保存
con.commit()
# dbとカーソルを閉じる
cur.close()
con.close()
楽曲情報の整理
楽曲情報と楽曲特徴を別のテーブルに格納するために,下記のコードで楽曲情報と楽曲特徴を整理します.
python
def getTrackInfo(track_id, meta):
name = meta['name']
album = meta['album']['name']
artist = meta['album']['artists'][0]['name']
release_date = meta['album']['release_date']
country = meta['external_ids']['isrc'][0:2]
length = meta['duration_ms']
popularity = meta['popularity']
track_info = [track_id, name, album, artist, release_date, country, length, popularity]
return track_info
def getTrackFeatures(track_id, features):
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_features = [track_id, key, mode, danceability, acousticness, energy, instrumentalness, liveness, loudness, speechiness, tempo, time_signature, valence]
return track_features
1970年から2021年までの楽曲情報を抽出
下記のコードで邦楽情報の抽出を実行します.
工程は下記の通りです.
- SpotifyAPIの起動
- 検索年を指定(1970~2021)
- offsetを指定
- 検索実行
- 楽曲IDを取得(external_idsなしは省く)
meta
に楽曲情報に入力external_ids
より邦楽か判定する(external_idsなしは省く)- 楽曲情報を整理
- info_table(楽曲情報)に格納
spotify.audio_features()
で楽曲特徴を抽出- 楽曲特徴を整理
- feature_table(楽曲特徴)に格納
python
import time
import spotipy
import pprint
import pandas as pd
from spotipy.oauth2 import SpotifyClientCredentials
# APIのIDとキー
MyID = "****************" #client ID
MySecret= "****************" #client secret
# 工程1_spotifyAPI起動
ccm = SpotifyClientCredentials(client_id = MyID, client_secret = MySecret)
spotify = spotipy.Spotify(client_credentials_manager = ccm)
# 工程2_検索年を指定(1970~2021)
for year in range(2004, 2022):
# 工程3_offsetを指定
for num in range(0, 1000, 50):
# 工程4_検索実行
result = spotify.search(q=f'year:{year}', limit=50, offset=num, type='track', market='JP')
for track in result['tracks']['items']:
# 工程5_楽曲IDを取得
track_id = track['id']
time.sleep(0.5)
# 工程6_楽曲情報の抽出
meta = spotify.track(track_id)
# 工程7_邦楽判定(external_idsなしは省く)
if len(meta['external_ids'])==0:
continue
if not meta['external_ids']['isrc'][0:2] == 'JP':
continue
try:
# 工程8_楽曲情報を整理
meta_info = getTrackInfo(track_id, meta)
# 工程9_info_table(楽曲情報)に格納
cur.execute(f"INSERT INTO info_table VALUES ({meta_info});".replace('[', '').replace(']', ''))
except:
print(f"ERROR info_table :{track_id}")
try:
# 工程10_楽曲特徴の抽出
features = spotify.audio_features(track_id)
# 工程11_楽曲特徴を整理
features_info = getTrackFeatures(track_id, features)
# 工程12_feature_table(楽曲特徴)に格納
cur.execute(f"INSERT INTO feature_table VALUES ({features_info});".replace('[', '').replace(']', ''))
except:
print(f"ERROR feature_table :{track_id}")
# テーブル変更を保存
con.commit()
# dbとカーソルを閉じる
cur.close()
con.close()
まとめ
ここまでで,PythonでSpotify APIを使って1970年から2021年までの楽曲情報を抽出しDBに格納しました.
次回から,楽曲をyoutubeで検索してダウンロードまで実行します.
参考サイト
PythonでSpotify APIを使ってみる ~全ての音楽愛好家のためのSpotify API ep 1~
Spotify Web APIから分析用データセットをつくる