Zenn
🎵

dltでSpotifyのAPIからDuckDBにデータをロードしてみた

2025/02/09に公開

はじめに

dltとは、ELTのExtractとLoadを行うための軽量なPythonのパッケージです。データベースやクラウド上のストレージ、REST APIなど様々な形式に対応しています。

この記事では、dltを使ってREST APIからDuckDBに入れるところまでをやってみます。今回はSpotify Web APIで試してみました。

https://dlthub.com/docs/intro

(公式のドキュメントにあるパックマンのGIF画像がかわいいです)

Spotify API to DuckDB

今回試したコードはGitHubでも公開しています。こちらも参考にしてください。
https://github.com/Shakshi3104/spotify-dlt-duck-db

Spotify Web APIの設定

Spotify Web APIを使用するには、Spotify Developerに登録し、Client IDとClient secretを取得する必要があります。
https://developer.spotify.com/documentation/web-api
下記のnote記事などを参考にして、アプリを作成しClient IDとClient secretを取得したら、前準備は完了です。
https://note.com/bunsekiya_tech/n/n2e3151a6b8fa

パッケージのインストール

以下のパッケージをインストールします。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を叩いた結果を見ることができます。
https://developer.spotify.com/documentation/web-api/reference/get-an-artists-top-tracks

パイプラインの実行

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

ログインするとコメントできます