En este tutorial aprenderás cómo obtener información directamente de las bases de datos de Spotify utilizando la librería Spotipy de Python. Veremos cómo realizar consultas para extraer datos y colocarlos en tablas para su procesamiento, y finalmente descargar la información en formato CSV.
Equipaje recomendado
Programación en Python: uso de funciones, diccionarios y ciclos.
Antes de comenzar… ¿API?
La librería Spotipy de Python permite establecer comunicación con la API Web de Spotify, la cual a su vez ofrece un medio para la extracción de datos mediante comandos con contenido específico para cada tipo de consulta. Para poder utilizar de manera efectiva esta librería, es necesario tener al menos la noción de lo que es una API, cómo funciona, y (para el caso específico de Spotify) cómo y dónde está documentada.
¿Qué es una API?
Cómo se menciona en el artículo sobre cómo obtener conjuntos de datos, una API es una interfaz de programación de aplicaciones, lo cual es, en pocas palabras, una forma de comunicación entre diferentes softwares mediante protocolos relativamente sencillos.
Una API (en específico, una API Web) permite establecer comunicación con plataformas web como Facebook, Google, Netflix o Spotify, y pueden ser consumidas mediante diversas aplicaciones y lenguajes de programación, dentro de los cuales se encuentra Python.
API Web
Las APIs Web son un tipo de API que se utilizan para generar comunicación entre aplicaciones mediante el uso de la web. Esta conexión se da mediante solicitudes que se realizan a servidores mediante un protocolo HTTP, el cual, simplemente, es la manera estandarizada en la que se deben estructurar los mensajes para generar tales solicitudes.
La Figura T.1 muestra de forma muy simplificada cómo se establece el flujo de datos mediante el consumo de una API Web:
Ejemplos de API web
Algunos ejemplos de este tipo de API son los siguientes:
GitHub API:
- Usada para acceder a datos de repositorios, usuarios, y más.
- Ejemplo de uso: Obtener información de un usuario de GitHub.
- Documentación
Twitter/X API v2:
- Usada para interactuar con tweets, usuarios, y estadísticas.
- Ejemplo de uso: Publicar un tweet desde tuuna aplicación desarrollada por ti.
- Documentación
OpenWeatherMap API:
- Ofrece datos climáticos como temperatura, precipitación, etc.
- Ejemplo de uso: Consultar el clima actual de una ciudad.
- Documentación
Google Maps API:
- Ofrece servicios como generación de mapas, cálculo de rutas, y geocodificación.
- Ejemplo de uso: Obtener coordenadas de una dirección.
- Documentación
API Web de Spotify y endpoints
La API Web de Spotify permite interactuar con el servicio de streaming de Spotify para realizar acciones como recuperar datos y metadatos de contenido, obtener recomendaciones, crear y gestionar listas de reproducción, o controlar la reproducción misma.
Para el uso de esta API se deben seguir al pie de la letra las formas de comunicación con los puntos de acceso o endpoints especificados por Spotify. Un endpoint es una URL que podemos utilizar para enviar solicitudes para interactuar con el servidor.
Estos endpoints están detallados en la documentación de la API: https://developer.spotify.com/documentation/web-api
En el cómo llamar a estos endpoints es donde entra en acción la librería de Spotipy, ya que simplifica la forma de consumir la API Web mediante funciones. Pasemos a ver cómo utilizarla.
Cómo consumir la API Web de Spotify con Python
1. Configura una aplicación en Spotify for developers
Para poder acceder a la API, antes deberás crear una cuenta en https://developer.spotify.com/, y crear una app (un registro de proyecto que te permitirá extraer datos); es muy sencillo y rápido.
Primero deberás acceder a la sección de Login en la página principal e iniciar sesión si ya tienes una cuenta, o crear una:
Una vez realizado tu ingreso a la plataforma, deberás acceder a tu dashboard desde el menú desplegable del header:
Acepta los términos y condiciones:
Una vez dentro del dashboard, deberás dar clic en el botón «Create app«:
Llenas los campos del formulario y das en «Save«:
Y con esto ya has completado el primer paso, lo siguiente es obtener las credenciales para acceder a la API.
2. Obtén tu client ID y client secret
Después de haber creado la app, deberás obtener códigos de identificación que te permitan hacer uso de la API, estos los podrás extraer desde la opción de «Settings» de tu app:
Una vez ahí, elige la opción «View client secret«, debajo del Client ID:
Finalmente, te mostrará los valores que necesitas:
Y listo, con estas cadenas de caracteres puedes comenzar a utilizar la API.
3. Configuración en Python
Ahora proseguiremos a instalar la librería en nuestro entorno de ejecución; estos pasos pueden variar ligeramente dependiendo de dónde correrás tu programa, ya sea en tu ordenador de forma local o en un servicio en la nube como Google Colab, si no sabes de qué se trata, visita este rápido tutorial. Aquí te explicaré ambas formas:
Pasos si ejecutarás el código de forma local
Primero, claramente debemos asegurarnos de tener Python instalado en nuestro sistema. En caso contrario, puedes descargarlo desde python.org.
Una vez hecho esto, deberás crear un directorio para tu proyecto y, dentro de él, crear un entorno virtual. Puedes hacerlo utilizando el siguiente comando en tu terminal:
python3 -m venv spotify_env
Ahora activa el entorno virtual ejecutando el siguiente comando:
En macOS/Linux:
source spotify_env/bin/activate
En Windows:
spotify_env\Scripts\activate
Por último, instala la librería Spotipy ejecutando el siguiente comando dentro de tu compilador de Python:
pip install spotipy
Pasos si ejecutarás el código en Google Colab
En lo que respecta a Google Colab, solo deberías instalar la librería utilizando el siguiente comando:
!pip install spotipy
4. Comencemos con Python: declaración de credenciales
Es hora de programar; lo siguiente será importar las librerías, declarar las variables client_id y client_secret con los valores que obtuviste al crear tu app (las credenciales para utilizar la API), y definir la variable que se utilizará para llamar a la API:
# Se importan las librerías necesarias.
import spotipy
import pandas as pd
from spotipy.oauth2 import SpotifyClientCredentials
# Se declara el ID del cliente.
client_id = '1ac2cc06cf774a9caa548b37a4e22ddf'
# Se declara el valor del secret client.
client_secret = '401d357f92584b80b26f40f9f8664eaa'
client_credentials_manager = SpotifyClientCredentials(client_id, client_secret)
# Se crea el cliente que se utilizará para consumir la API.
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
5. Extrayendo datos
Con lo que tenemos hasta ahora ya podemos dar inicio a la obtención de datos de Spotify. ¿Qué es lo que podemos obtener utilizando la API?, las opciones son variadas, y pueden ser consultadas en la documentación de la librería: https://spotipy.readthedocs.io/en/2.24.0/#api-reference
Vayamos a un ejemplo específo para comprender cómo debemos estructurar las consultas. Supongamos que has explorado las funciones a utilizar, y te decides por la función search, la cual permite obtener información del catálogo de Spotify sobre álbumes, artistas, listas de reproducción, canciones, programas, episodios o audiolibros que coincidan con una cadena de palabras clave (es decir, buscará y traerá información sobre algún elemento especificado).
Debemos identificar los elementos que conforman al comando para utilizar esta función en la documentación de la librería:
Notarás que se hace una breve descripción de lo que hace la función, y se especifican los parámetros que deben pasarse.
El parámetro más importante es q, el cual es la consulta de búsqueda a realizar, la cual puede ser acotada con los demás parámetros. La salida de esta función puede ser consultada en su respectivo espacio en la documentación de la API: https://developer.spotify.com/documentation/web-api/reference/search
Es aquí donde podemos ver por qué es necesario entender que es la API web y cómo es utilizada por la librería Spotipy, será necesario atender a ambas documentaciones para generar y comprender las consultas.
Ahora utilicemos la función. Supongamos que has decidido realizar la búsqueda «Blackpink» para obtener información sobre este grupo desde los servidores de Spotify. Usarías la función como sigue, especificando el nombre del grupo, y que se trata de un artista y no de una canción o algún otro tipo:
# Se busca información sobre Blackpink.
result = sp.search(q='Blackpink', type='artist', limit=1)
# Se imprime el resultado.
result
Como se aprecia arriba en la salida del código, el resultado es un diccionario con diferentes elementos correspondientes a información relacionada a la consulta (géneros a los que pertenece, imágenes relacionadas, popularidad, etc.), en este caso, la agrupación Blackpink.
Si deséaramos obtener de este diccionario, por ejemplo, el número de seguidores que tiene el grupo en la plataforma, tendríamos que acceder a la llave «followers«, y después al elemento ‘total‘:
# Se imprime el número de seguidores de Blackpink.
result['artists']['items'][0]['followers']['total']
El valor retornado es el que se ve debajo de las líneas de código.
Ahora supongamos que queremos algo un poco más complejo: las 10 canciones más populares del grupo. Para esto obtendremos el ID que ha asignado Spotify a Blackpink, y después usaremos el método artist_top_tracks para obtener las canciones.
El código quedaría como sigue:
# Se busca información sobre Blackpink y se obtiene su ID de artista.
result = sp.search(q='Blackpink', type='artist', limit=1)
blackpink_id = result['artists']['items'][0]['id']
# Se obtienen las 10 canciones más escuchadas de Blackpink.
results = sp.artist_top_tracks(blackpink_id, country='US')
# Se imprime el nombre de las canciones.
for track in results['tracks']:
print(track['name'])
Como notarás, el uso de esta librería consiste en definir qué datos requieres, y traerlos mediante la manipulación de las respuestas de la API. Para saber todo sobre la información que puedes disponer a través de este medio, no olvides consultar las referencias del repositorio oficial de la librería, y complementar tu comprensión de cada característica acudiendo a la página oficial de la API de Spotify.
Nota: a veces la ejecución de códigos con esta librería puede arrojar el siguiente error:
Si es el caso, no te preocupes, esto se debe a una inocua incidencia de conexión; solo vuelve a ejecutar el código.
6. Extracción, transformación y descarga de datos: de diccionarios a tablas, y de tablas a CSV/Excel
Por último, te mostraré un ejemplo de cómo obtener una tabla con datos de 500 canciones, y descargar esta en formato CSV o Excel.
La intención será la de obtener una lista de 50 canciones de 10 géneros diferentes, de las cuales se tendrá la siguiente información: nombre, género, bailabilidad, energía, acústica, duración, discursividad, instrumentalidad, sonoridad, valencia, tempo, ID, y modo.
Estas características son métricas creadas por Spotify, y la definición de cada una se puede consultar en este link.
El siguiente fragmento de código crea una función para la extracción de 50 canciones del género definido, sus características, y acomoda la información en un dataFrame de Pandas:
def songs_by_genre(genre):
"""Función para extraer las 50 canciones más escuchadas de un género en específico de Spotify"""
# Se buscan las 50 canciones más populares del género especificado.
results = sp.search(q=f'genre:{genre}', type='track', limit=50)
tracks = results['tracks']['items']
# Se crea una lista de diccionarios con el nombre de la canción y las características deseadas.
song_features = []
for track in tracks:
features = sp.audio_features(track['id'])[0]
song_features.append({'Nombre': track['name'], 'Bailabilidad': features['danceability'], 'Energía': features['energy'], 'Acústica': features['acousticness'], 'Duración (ms)': features['duration_ms'],
'Acústica': features['acousticness'], 'Instrumentalidad': features['instrumentalness'], 'Sonoridad': features['loudness'], 'Tempo': features['tempo'],
'Discursividad': features['speechiness'],'ID': features['id'], 'Modo': features['mode'], 'Valencia': features['valence'], 'Género': genre})
# Se crea un dataFrame de Pandas con la información extraída.
data_frame = pd.DataFrame(song_features)
return data_frame
Después, creamos un bucle que obtenga estos datos para cada género especificado en una lista, y concatenamos las tablas resultantes:
# Se importa una librería para la generación de una barra de progreso.
from tqdm import tqdm
# Se crea una lista con los géneros musicales deseados.
genres_list = ['world-music', 'salsa', 'rock-n-roll', 'reggae', 'reggaeton', 'pop', 'black-metal', 'k-pop', 'hip-hop', 'electronic']
# Se itera sobre esta lista utilizando sus elementos como entradas de la función creada.
tables = []
for item in tqdm(genres_list, desc = 'Creando conjunto de datos:'):
table = songs_by_genre(item)
tables.append(table)
# Se concatenan las tablas y se imprime el resultado.
dataset = pd.concat(tables)
dataset
El resultado es un conjunto de datos estructurados en formato de tabla, con 500 renglones y 13 columnas.
Por último, se puede obtener en formato CSV o Excel como sigue:
De forma local:
# Se guarda en formato CSV.
dataset .to_csv('dataset .csv', index=False)
# Se guarda en formato Excel.
dataset .to_excel('dataset .xls', index=False)
En Google Colab:
# Se guarda en formato CSV.
dataset .to_csv('dataset .csv', index=False)
# Se guarda en formato Excel.
dataset .to_excel('dataset .xls', index=False)
# Se descarga el CSV.
from google.colab import files
files.download('dataset .csv')
# Se descarga el Excel.
from google.colab import files
files.download('dataset .xls')
Puedes ver y ejecutar el código completo en Google Colab dando clic al siguiente botón:
Con esto concluimos este rápido tutorial de consumo de la API de Spotify en Python; notarás que es un proceso sencillo, y que depende de que te instruyas en qué datos puedes extraer, y cómo puedes acceder a ellos correctamente en el formato en el que son entregados.
¿Siguientes pasos? Lo que puedes hacer ahora es someter estos datos a un preprocesamiento y procesamiento, para un análisis o un modelo de aprendizaje automático. ¿Te interesa ver cómo alimentar un algoritmo de machine learning con estos datos? Revisa el tutorial sobre regresión logística, donde te enseño un código de Python en el que utilizamos estos datos para entrenar un modelo que aprende a clasificar canciones en diversos géneros musicales dadas algunas características.