Como extrair dados do Spotify utilizando Python

Comentários: 0

Os dados da lista de reprodução do Spotify podem ser úteis para coletar informações sobre músicas, artistas e outros detalhes da faixa. O Spotify não fornece acesso detalhado a alguns dados sem uma chave de API, mas aproveitando o Playwright para Python, podemos acessar conteúdo dinâmico e extrair dados de playlist diretamente do site do Spotify. Este artigo ilustra como implementar o Playwright para extrair informações como nomes de faixas, nomes de bandas, links e durações de faixas das listas de reprodução do Spotify.

Requisitos e instalação

Para começar, instale o Playwright e o lxml para lidar com o conteúdo dinâmico da página e a análise de HTML:


pip install playwright
pip install lxml

Em seguida, para ativar os navegadores do Playwright, use o seguinte comando para baixar os binários de navegador necessários:


playwright install

Com isso configurado, estamos prontos para raspar o Spotify.

Processo de raspagem do Spotify: Guia Passo-a-Passo

O conteúdo do Spotify é carregado dinamicamente, portanto, usar solicitações ou outras bibliotecas HTTP simples não capturará todas as informações renderizadas pelo JavaScript. O Playwright é uma biblioteca de automação de navegador que nos permite interagir com sites dinâmicos como se estivéssemos navegando neles, o que significa que podemos esperar que o JavaScript seja carregado antes de fazer o scraping.

O Playwright também suporta a configuração de proxy, permitindo-nos usar IPs diferentes, se necessário, para evitar a limitação de taxa ou restrições geográficas no Spotify.

Abaixo, você encontrará um guia detalhado e passo a passo para raspagem, completo com exemplos de código para uma compreensão mais clara e visual do processo.

Passo 1. Configurar a função para ir buscar conteúdo HTML

A função fetch_html_content inicializa o ambiente do Playwright, inicia um navegador e navega até o URL da lista de reprodução do Spotify. Aqui, definimos headless=False para que a interface do navegador permaneça visível (útil para depuração); para tarefas automatizadas, defini-la como True acelerará a execução.

A opção wait_until='networkidle' aguarda que a atividade da rede estabilize antes de capturar o conteúdo da página, assegurando que todos os elementos são carregados corretamente.


from playwright.async_api import async_playwright

async def fetch_html_content(playlist_url):
    async with async_playwright() as p:
        # Iniciar o browser com a configuração do proxy, se necessário
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        # Navegar para o URL
        await page.goto(playlist_url, wait_until='networkidle')

        # Dar tempo para que a atividade da rede se estabilize
        await page.wait_for_timeout(3000)

        # Capturar o conteúdo da página
        page_content = await page.content()

        # Fechar o browser
        await browser.close()

        return page_content


Para utilizar um proxy com autenticação de endereço IP no Playwright, configure a função de lançamento da seguinte forma:


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

Isto encaminhará os pedidos através do servidor proxy especificado, mascarando o seu IP original e ajudando a evitar potenciais restrições de scraping.

Passo 2. Analisar o conteúdo HTML

Com a função fromstring do lxml, criamos um analisador para o conteúdo HTML obtido. Isto permite-nos localizar e extrair dados específicos utilizando expressões XPath.


from lxml.html import fromstring

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

Passo 3. Extrair informações sobre a faixa

Com os selectores XPath, recolhemos os seguintes detalhes para cada faixa na lista de reprodução:

  1. Nomes de faixas;
  2. URLs de faixas;
  3. Nomes de Artistas;
  4. URLs dos artistas;
  5. Duração das faixas.

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

As listas de URL são completadas com o domínio Spotify para criar ligações totalmente qualificadas.

Passo 4. Salvando dados em um arquivo CSV

Depois de reunir os dados, nós os escrevemos em um arquivo CSV. Cada linha no arquivo contém o nome da faixa, o URL da faixa, o nome do artista, o URL do artista e a duração da faixa.


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)
    # Cabeçalho de escrita
    writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
    # Escrever linhas
    writer.writerows(rows)

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

Isto cria um ficheiro CSV bem estruturado que é fácil de analisar e utilizar em outras aplicações.

Exemplo de código completo com suporte de proxy

Aqui está o código completo, combinando todos os passos para um processo simplificado de recolha de dados do 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 o browser, com opção de proxy, se necessário
        browser = await p.chromium.launch(headless=False, proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"})
        page = await browser.new_page()

        # Navegar para o URL
        await page.goto(playlist_url, wait_until='networkidle')
        
        # Aguardar que a atividade da rede se estabilize
        await page.wait_for_timeout(3000)
        
        # Capturar o conteúdo da página
        page_content = await page.content()

        # Fechar o browser
        await browser.close()
        
        return page_content

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


# Detalhes do extrato
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()')

# Escrever para 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}")

A recolha de dados de listas de reprodução do Spotify utilizando Python com Playwright permite o acesso a conteúdos dinâmicos para extrair e analisar informações de faixas. Ao configurar o Playwright com proxies, podemos lidar com a limitação de taxas, criando uma forma fiável de recolher dados de listas de reprodução. Esta configuração abre possibilidades para uma análise detalhada e pode ser facilmente adaptada a outros tipos de conteúdo do Spotify.

Comentários:

0 Comentários