Como automatizar o download de músicas usando Python e web scraping

Neste guia técnico, vamos implementar um script em Python para baixar músicas automaticamente a partir de um site de streaming. O processo envolve o uso de bibliotecas para requisições HTTP e manipulação de dados JSON.

  1. Instalação das dependências

Comece instalando as bibliotecas necessárias via pip:

  • requests: para enviar requisições HTTP
  • prettytable: para organizar e exibir dados em formato tabular

Execute os comandos a seguir no terminal:

pip install requests
pip install PrettyTable
  1. Configuração do ambiente

Versão do Python: 3.8

IDE recomendada: PyCharm ou similar

  1. Estratégia de scraping

Para extrair dados de sites de música, é comum utilizar APIs internas que retornam informações em formato JSON. Esta abordagem é eficiente e evita a necessidade de parsers como BeautifulSoup.

  1. Implementação do script

Importe os módulos essenciais:

import requests
from urllib import parse
import prettytable as pt

Defina os cabeçalhos HTTP para simular uma requisição de navegador:

http_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Cookie': 'valor_do_cookie',
    'Referer': 'https://site-exemplo.com/'
}

Realize a busca por músicas através da API do site:

termo_busca = input("Informe o termo de busca: ")
endpoint_busca = f'https://site-exemplo.com/api/search?q={termo_busca}&pagina=1&limite=30'
resposta_busca = requests.get(endpoint_busca, headers=http_headers)
dados_musicas = resposta_busca.json()
lista_musicas = dados_musicas.get('data', [])

Crie uma tabela para exibir os resultados:

tabela = pt.PrettyTable()
tabela.field_names = ['Índice', 'Nome da Música', 'Artista', 'Álbum']
info_musicas = []

for pos, musica in enumerate(lista_musicas):
    nome_musica = musica.get('titulo')
    nome_artista = musica.get('artista')
    nome_album = musica.get('album')
    id_musica = musica.get('id')
    info_musicas.append({'id': id_musica, 'titulo': nome_musica, 'artista': nome_artista})
    tabela.add_row([pos, nome_musica, nome_artista, nome_album])

print(tabela)

Implemente uma função para baixar uma música específica:

def baixar_musica(id_musica, titulo, artista):
    url_download = f'https://site-exemplo.com/api/download?mid={id_musica}&qualidade=alta'
    resp_download = requests.get(url_download, headers=http_headers)
    link_audio = resp_download.json().get('url')
    
    conteudo_audio = requests.get(link_audio).content
    nome_arquivo = f'{artista} - {titulo}.mp3'
    with open(nome_arquivo, 'wb') as arquivo:
        arquivo.write(conteudo_audio)
    print(f'Download finalizado: {titulo}')

Adicione interatividade para que o usuário selecione músicas para download:

while True:
    entrada = input("Digite o índice da música desejada (-1 para encerrar): ")
    if entrada == '-1':
        break
    indice = int(entrada)
    if 0 <= indice < len(info_musicas):
        dados_selecionados = info_musicas[indice]
        baixar_musica(dados_selecionados['id'], dados_selecionados['titulo'], dados_selecionados['artista'])
    else:
        print("Índice inválido. Tente novamente.")

Tags: Python web scraping Requests JSON HTTP

Publicado em 7-5 22:48