dltでSpotifyのAPIからDuckDBにデータをロードしてみた
はじめに
dltとは、ELTのExtractとLoadを行うための軽量なPythonのパッケージです。データベースやクラウド上のストレージ、REST APIなど様々な形式に対応しています。
この記事では、dltを使ってREST APIからDuckDBに入れるところまでをやってみます。今回はSpotify Web APIで試してみました。
(公式のドキュメントにあるパックマンのGIF画像がかわいいです)
Spotify API to DuckDB
今回試したコードはGitHubでも公開しています。こちらも参考にしてください。
Spotify Web APIの設定
Spotify Web APIを使用するには、Spotify Developerに登録し、Client IDとClient secretを取得する必要があります。
下記のnote記事などを参考にして、アプリを作成しClient IDとClient secretを取得したら、前準備は完了です。パッケージのインストール
以下のパッケージをインストールします。Spotifyの認証をちょっと楽にするためにspotipy
もインストールします。
pip install dlt[duckdb] pandas streamlit spotipy
Spotifyのデータを取得
Spotifyの認証
spotipy
を使って、access tokenを取得します。以下のようなコードを実行するとJSON形式で帰ってきます。ここで取得したaccess tokenを後ほど使用します。
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
# Spotify Web APIのaccess tokenを取得する
client_id = 'Your Spotify Client ID'
client_secret = 'Your Spotify Client Secret'
credentials = SpotifyClientCredentials(
client_id=client_id,
client_secret=client_secret
)
access_token = credentials.get_access_token()
取得するデータの設定
取得するデータの設定をします。今回は、Artist's Top TracksのAPIで試してみました。このAPIは指定したアーティストのトップトラックの情報を取得するものです。アーティストのIDは、SpotifyのアーティストページのURLから特定できます。例えば、なにわ男子の場合は5V0oa9WaeYkBszHV6ItVD6
です。
# アーティストのIDを設定
artist_id = "5V0oa9WaeYkBszHV6ItVD6"
base_url = f"https://api.spotify.com/v1/artists/{artist_id}/"
REST APIの設定は、以下のようにします。"client"
にはベースのURLやaccess tokenを設定します。"resources"
に取得するAPIに関する設定を書きます。今回は、Artist's Top Tracksを取得したいので、"endpoint"
の"path"
に"top-tracks"
を設定しました。
import dlt
from dlt.sources.rest_api import (
RESTAPIConfig,
rest_api_source,
)
# REST APIの設定
config: RESTAPIConfig = {
"client": {
"base_url": base_url,
"auth": (
{
"type": "bearer",
"token": access_token["access_token"],
}
if access_token
else None
)
},
"resources": [
{
"name": "top-tracks",
"endpoint": {
"path": "top-tracks",
"params": {
"market": "JP"
}
}
}
],
}
# REST APIのソース
source = rest_api_source(config)
上記の設定は、以下のようにcurlで取得することと同様です。
curl --request GET \
--url 'https://api.spotify.com/v1/artists/5V0oa9WaeYkBszHV6ItVD6/top-tracks?market=JP' \
--header 'Authorization: Bearer <access token>'
ちなみに、SpotifyのドキュメントではAPIを叩いた結果を見ることができます。
パイプラインの実行
REST APIの設定をしたら、パイプラインを実行します。今回はDuckDBにデータを入れるので、destination="duckdb"
とします。
pipeline.run()
を実行すると、DuckDBにデータがロードされます。
# Pipelineの設定
pipeline = dlt.pipeline(
pipeline_name="spotify_api_example",
destination="duckdb",
dataset_name="naniwa_top_tracks"
)
# Pipelineの実行
load_info = pipeline.run(source)
テーブルの情報
以下のコマンドを実行すると、パイプラインによってロードしたテーブルの情報を見ることができます。
dlt pipeline spotify_api_example show
実行するとstreamlitのアプリが起動し、ブラウザが開きます。ここでは、テーブルやスキーマの情報を見ることができます。
DuckDBにデータが入ってることを確認
DuckDBに対して、以下のクエリを実行してデータが入っていることを確認します。
select
name,
popularity,
album__name,
external_urls__spotify
from naniwa_top_tracks.top_tracks
Pythonで実行する場合は、以下のようなコードで確認できます。
duckdb_connection = 'spotify_api_example.duckdb'
spotify_data = duckdb.connect(duckdb_connection)
rel = spotify_data.sql(
"""
select name, popularity, album__name, external_urls__spotify
from naniwa_top_tracks.top_tracks
"""
)
rel.show()
以下のような結果が返ってきます。
popularity
は、0から100の値を取り、100が一番人気という意味を表しているらしいです。この結果を見ると、なにわ男子の曲の中では勇気100%が人気だということがわかります。
おわりに
今回は、dltを使ってSpotify Web APIからデータを取得しDuckDBにロードしてみました。dltの使い所はREST APIをとりあえずDBに入れるところで、その後はdbtを使って整形して分析に使うのが良いのかなと感じました。今回はDuckDBに入れるところまでを試したので、dbtで整形してLightdashなどで可視化するところもやってみたいと思います。
Discussion