Come raschiare i dati di Spotify usando Python

Commenti: 0

I dati delle playlist di Spotify possono essere utili per raccogliere informazioni su canzoni, artisti e altri dettagli sulle tracce. Spotify non fornisce un accesso dettagliato ad alcuni dati senza una chiave API, ma sfruttando Playwright per Python, possiamo accedere a contenuti dinamici ed estrarre dati sulle playlist direttamente dal sito web di Spotify. Questo articolo illustra come implementare Playwright per lo scraping di informazioni quali i nomi dei brani, i nomi delle band, i link e la durata dei brani dalle playlist di Spotify.

Requisiti e installazione

Per iniziare, installare Playwright e lxml per gestire il contenuto dinamico della pagina e l'analisi dell'HTML:

pip install playwright
pip install lxml

Quindi, per abilitare i browser di Playwright, usare il seguente comando per scaricare i binari dei browser richiesti:


playwright install

Con queste impostazioni, siamo pronti a fare lo scraping di Spotify.

Processo di scraping di Spotify: Guida passo per passo

Il contenuto di Spotify viene caricato dinamicamente, quindi utilizzare requests o altre semplici librerie HTTP non consente di acquisire tutte le informazioni generate da JavaScript. Playwright è una libreria per l'automazione del browser che ci permette di interagire con siti web dinamici come se li stessimo navigando direttamente, il che significa che possiamo attendere il caricamento del JavaScript prima di procedere con il scraping.

Playwright supporta anche la configurazione di proxy, permettendoci di usare indirizzi IP differenti se necessario, per evitare limiti di richiesta o restrizioni geografiche su Spotify.

Di seguito troverai una guida dettagliata passo dopo passo sullo scraping, completa di esempi di codice per una comprensione più chiara e visiva del processo.

Passo 1. Impostazione della funzione di recupero del contenuto HTML

La funzione fetch_html_content inizializza l’ambiente Playwright, avvia un browser e accede all’URL della playlist di Spotify. Qui impostiamo headless=False in modo che l'interfaccia del browser rimanga visibile (utile per il debug); per attività automatizzate, impostarlo su True velocizzerà l’esecuzione.

L'opzione wait_until='networkidle' attende che l’attività di rete si stabilizzi prima di acquisire il contenuto della pagina, assicurando che tutti gli elementi vengano caricati correttamente.


from playwright.async_api import async_playwright

async def fetch_html_content(playlist_url):
    async with async_playwright() as p:
        # Avviare il browser con l'impostazione del proxy, se necessario
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        # Navigare verso l'URL
        await page.goto(playlist_url, wait_until='networkidle')

        # Lasciare che l'attività di rete si stabilizzi
        await page.wait_for_timeout(3000)

        # Acquisizione del contenuto della pagina
        page_content = await page.content()

        # Chiudere il browser
        await browser.close()

        return page_content


Per utilizzare un proxy con autenticazione dell'indirizzo IP in Playwright, configurare la funzione di lancio come segue:


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

Questo instrada le richieste attraverso il server proxy specificato, mascherando il vostro IP originale e aiutandovi a evitare potenziali restrizioni di scraping.

Passo 2. Analizzare il contenuto HTML

Con la funzione fromstring di lxml, creiamo un parser per il contenuto HTML recuperato. Questo ci permette di individuare ed estrarre dati specifici usando le espressioni XPath.


from lxml.html import fromstring

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

Passo 3. Estrazione delle informazioni sulla traccia

Con i selettori XPath, raccogliamo i seguenti dettagli per ogni brano della playlist:

  1. Nomi delle tracce;
  2. Url delle tracce;
  3. Nomi degli artisti;
  4. Url degli artisti;
  5. Durata delle tracce.

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()')

Gli elenchi di URL vengono completati con il dominio Spotify per creare link completamente qualificati.

Passo 4. Salvataggio dei dati in un file CSV

Dopo aver raccolto i dati, li scriviamo in un file CSV. Ogni riga del file contiene il nome del brano, l'URL del brano, il nome dell'artista, l'URL dell'artista e la durata del brano.


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)
    # Scrivere l'intestazione
    writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
    # Scrivere le righe
    writer.writerows(rows)

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

In questo modo si crea un file CSV ben strutturato, facile da analizzare e da utilizzare in altre applicazioni.

Esempio di codice completo con supporto proxy

Ecco il codice completo, che combina tutti i passaggi per un processo semplificato di scraping di 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:
        # Avviare il browser, con l'opzione proxy, se necessario.
        browser = await p.chromium.launch(headless=False, proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"})
        page = await browser.new_page()

        # Navigare verso l'URL
        await page.goto(playlist_url, wait_until='networkidle')
        
        # Attendere che l'attività di rete si stabilizzi
        await page.wait_for_timeout(3000)
        
        # Acquisizione del contenuto della pagina
        page_content = await page.content()

        # Chiudere il browser
        await browser.close()
        
        return page_content

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


# Dettagli dell'estratto
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()')

# Scrivere su 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}")

Raccogliere i dati delle playlist di Spotify utilizzando Python con Playwright consente di accedere a contenuti dinamici per estrarre e analizzare le informazioni sui brani. Configurando Playwright con i proxy, possiamo gestire la limitazione del tasso, creando un modo affidabile per raccogliere i dati delle playlist. Questa configurazione offre la possibilità di effettuare analisi dettagliate e può essere facilmente adattata ad altri tipi di contenuti Spotify.

Commenti:

0 Commenti