Cómo extraer datos de Spotify con Python

Comentarios: 0

Los datos de las listas de reproducción de Spotify pueden ser útiles para recopilar información sobre canciones, artistas y otros detalles de las pistas. Spotify no proporciona acceso detallado a algunos datos sin una clave API, pero aprovechando Playwright para Python, podemos acceder a contenido dinámico y extraer datos de listas de reproducción directamente del sitio web de Spotify. Este artículo ilustra cómo implementar Playwright para extraer información como nombres de canciones, nombres de grupos, enlaces y duración de las canciones de las listas de reproducción de Spotify.

Requisitos e instalación

Para empezar, instala Playwright y lxml para manejar el contenido dinámico de la página y el análisis sintáctico de HTML:


pip install playwright
pip install lxml

A continuación, para habilitar los navegadores Playwright, utilice el siguiente comando para descargar los binarios de navegador necesarios:


playwright install

Con esto configurado, ya estamos listos para scrapear Spotify.

Proceso de scrapeo de Spotify: Guía paso a paso

El contenido de Spotify se carga de forma dinámica, por lo que utilizar peticiones u otras librerías HTTP simples no capturará toda la información renderizada por JavaScript. Playwright es una biblioteca de automatización del navegador que nos permite interactuar con sitios web dinámicos como si estuviéramos navegando por ellos nosotros mismos, lo que significa que podemos esperar a que se cargue JavaScript antes de realizar el scraping.

Playwright también admite la configuración de proxy, lo que nos permite utilizar diferentes IP si es necesario para evitar la limitación de velocidad o las restricciones geográficas en Spotify.

A continuación, encontrarás una guía detallada paso a paso del scraping, completa con ejemplos de código para una comprensión más clara y visual del proceso.

Paso 1. Configurar la función para obtener contenido HTML

La función fetch_html_content inicializa el entorno de Playwright, abre un navegador y navega hasta la URL de la lista de reproducción de Spotify. Aquí, establecemos headless=False para que la interfaz del navegador permanezca visible (útil para depuración); para tareas automatizadas, establecerlo en True acelerará la ejecución.

La opción wait_until='networkidle' espera a que la actividad de la red se estabilice antes de capturar el contenido de la página, lo que garantiza que todos los elementos se carguen correctamente.


from playwright.async_api import async_playwright

async def fetch_html_content(playlist_url):
    async with async_playwright() as p:
        # Inicie el navegador con la configuración del proxy si es necesario
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        # Navegue hasta la URL
        await page.goto(playlist_url, wait_until='networkidle')

        # Dar tiempo a que se asiente la actividad de la red
        await page.wait_for_timeout(3000)

        # Capturar el contenido de la página
        page_content = await page.content()

        # Cerrar el navegador
        await browser.close()

        return page_content


Para utilizar un proxy con autenticación de dirección IP en Playwright, configure la función de lanzamiento como se indica a continuación:


browser = await p.chromium.launch(headless=True, proxy={"server": "http://your-proxy-server:port"})

Esto enrutará las peticiones a través del servidor proxy especificado, enmascarando su IP original y ayudando a evitar posibles restricciones de scraping.

Paso 2. Analizar el contenido HTML

Con la función fromstring de lxml, creamos un analizador para el contenido HTML obtenido. Esto nos permite localizar y extraer datos específicos utilizando expresiones XPath.


from lxml.html import fromstring

page_content = await fetch_html_content('https link')
parser = fromstring(page_content)

Paso 3. Extraer la información de la pista

Con los selectores XPath, recopilamos los siguientes detalles para cada pista de la lista de reproducción:

  1. Nombres de las pistas;
  2. URLs de las pistas;
  3. Nombres de artistas;
  4. URLs de artistas;
  5. Duración de las pistas.

track_names = parser.xpath('//div[@data-testid="tracklist-row"]//a[@data-testid="internal-track-link"]/div/text()')
track_urls = parser.xpath('//div[@data-testid="tracklist-row"]//a[@data-testid="internal-track-link"]/@href')
track_urls_with_domain = [f"https://open.spotify.com/{url}" for url in track_urls]
artist_names = parser.xpath('//div[@data-testid="tracklist-row"]//div[@data-encore-id="text"]/a/text()')
artist_urls = parser.xpath('//div[@data-testid="tracklist-row"]//div[@data-encore-id="text"]/a/@href')
artist_urls_with_domain = [f"https://open.spotify.com/{url}" for url in artist_urls]
track_durations = parser.xpath('//div[@data-testid="tracklist-row"]//div[@class="PAqIqZXvse_3h6sDVxU0"]/div/text()')

Las listas de URL se completan con el dominio de Spotify para crear enlaces totalmente cualificados.

Paso 4. Guardar los datos en un archivo CSV

Después de recopilar los datos, los escribimos en un archivo CSV. Cada fila del archivo contiene el nombre de la pista, la URL de la pista, el nombre del artista, la URL del artista y la duración de la pista.


import csv

rows = zip(track_names, track_urls_with_domain, artist_names, artist_urls_with_domain, track_durations)
csv_filename = "spotify_playlist.csv"

with open(csv_filename, mode='w', newline='') as file:
    writer = csv.writer(file)
    # Write header
    writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
    # Write rows
    writer.writerows(rows)

print(f"Data successfully written to {csv_filename}")

Esto crea un archivo CSV bien estructurado que es fácil de analizar y utilizar en otras aplicaciones.

Ejemplo de código completo con soporte para proxy

Aquí tienes el código completo, que combina todos los pasos para agilizar el proceso de scraping de Spotify:


from playwright.async_api import async_playwright
from lxml.html import fromstring
import csv

async def fetch_html_content(playlist_url):
    async with async_playwright() as p:
        # Iniciar el navegador, con opción de proxy si es necesario
        browser = await p.chromium.launch(headless=False, proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"})
        page = await browser.new_page()

        # Navegue hasta la URL
        await page.goto(playlist_url, wait_until='networkidle')
        
        # Espere a que se estabilice la actividad de la red
        await page.wait_for_timeout(3000)
        
        # Capturar el contenido de la página
        page_content = await page.content()

        # Cerrar el navegador
        await browser.close()
        
        return page_content

page_content = asyncio.run(fetch_html_content('https link'))
parser = fromstring(page_content)


# Detalles del extracto
track_names = parser.xpath('//div[@data-testid="tracklist-row"]//a[@data-testid="internal-track-link"]/div/text()')
track_urls = parser.xpath('//div[@data-testid="tracklist-row"]//a[@data-testid="internal-track-link"]/@href')
track_urls_with_domain = [f"https://open.spotify.com/{url}" for url in track_urls]
artist_names = parser.xpath('//div[@data-testid="tracklist-row"]//div[@data-encore-id="text"]/a/text()')
artist_urls = parser.xpath('//div[@data-testid="tracklist-row"]//div[@data-encore-id="text"]/a/@href')
artist_urls_with_domain = [f"https://open.spotify.com/{url}" for url in artist_urls]
track_durations = parser.xpath('//div[@data-testid="tracklist-row"]//div[@class="PAqIqZXvse_3h6sDVxU0"]/div/text()')

# Escribir en CSV
rows = zip(track_names, track_urls_with_domain, artist_names, artist_urls_with_domain, track_durations)
csv_filename = "spotify_playlist.csv"

with open(csv_filename, mode='w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
    writer.writerows(rows)

print(f"Data successfully written to {csv_filename}")

La recopilación de datos de listas de reproducción de Spotify mediante Python con Playwright permite acceder a contenido dinámico para extraer y analizar la información de las pistas. Al configurar Playwright con proxies, podemos gestionar la limitación de velocidad, creando una forma fiable de recopilar datos de listas de reproducción. Esta configuración abre posibilidades de análisis detallado y puede adaptarse fácilmente a otros tipos de contenido de Spotify.

Comentarios:

0 Comentarios