June 11

Сбор данных из плейлистов Spotify для музыкального анализа

Spotify ежедневно транслирует огромное количество треков. Представьте, что вы можете использовать эти данные для своего музыкального приложения или аналитического проекта. Хотите получить имена исполнителей, детали треков или информацию о плейлистах? Python даст вам возможность получить всё это — легально и эффективно.

В этом руководстве мы покажем, как собирать данные из плейлистов Spotify с помощью Python. Мы расскажем, как установить нужные библиотеки, работать с API Spotify, а также использовать Selenium и BeautifulSoup, если вам нужно больше, чем предоставляет API. К концу вы сможете профессионально собирать и сохранять данные о плейлистах.

Шаг 1: Подготовьте инструменты

Для начала установите необходимые библиотеки:

pip install beautifulsoup4 selenium requests

Вот их назначение:

  • BeautifulSoup: идеально подходит для парсинга статического HTML. Извлекает нужные элементы из исходного кода страницы.
  • Selenium: работает с динамическим контентом. Управляет страницей как реальный пользователь — кликает, скроллит и загружает всё, что нужно.
  • Requests: основной инструмент для HTTP-запросов. Используйте его для взаимодействия с API Spotify или простыми веб-страницами без браузера.

Шаг 2: Скачайте веб-драйвер

Selenium требует веб-драйвер для управления браузером. ChromeDriver — самый простой вариант. Скачайте его с официального сайта, распакуйте и запомните путь к файлу.

Простой тест для запуска Chrome с помощью Selenium:

from selenium import webdriver

driver_path = "C:/webdriver/chromedriver.exe"  # Обновите путь!
driver = webdriver.Chrome(driver_path)
driver.get("https://google.com")

Если Chrome откроется и перейдёт на Google — вы готовы!

Шаг 3: Изучите HTML Spotify

Нажмите F12 на странице плейлиста Spotify, чтобы увидеть структуру кода. Пример:

<div class="tracklist-row">
    <span class="track-name">Название песни</span>
    <span class="artist-name">Имя исполнителя</span>
    <span class="track-duration">3:45</span>
</div>

Именно эти элементы вы будете извлекать.

Шаг 4: Напишите функцию скрапинга

Объединим Selenium для загрузки динамического контента и BeautifulSoup для парсинга.

from selenium import webdriver
import time
from bs4 import BeautifulSoup

def get_spotify_playlist_data(playlist_url):
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")  # Запуск без открытия окна
    driver = webdriver.Chrome(options=options)

    driver.get(playlist_url)
    time.sleep(5)  # Ждём полной загрузки страницы

    # Скроллим вниз, чтобы загрузить все треки
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)  # Время для подгрузки контента

    html = driver.page_source
    driver.quit()

    soup = BeautifulSoup(html, "lxml")

    tracks = []
    for track in soup.find_all(class_="IjYxRc5luMiDPhKhZVUH UpiE7J6vPrJIa59qxts4"):
        name = track.find(
            class_="e-9541-text encore-text-body-medium encore-internal-color-text-base btE2c3IKaOXZ4VNAb8WQ standalone-ellipsis-one-line").text
        artist = track.find(class_="e-9541-text encore-text-body-small").find('a').text
        duration = track.find(
            class_="e-9541-text encore-text-body-small encore-internal-color-text-subdued l5CmSxiQaap8rWOOpEpk").text

        tracks.append({"название трека": name, "исполнитель": artist, "длительность": duration})

    return tracks

Шаг 5: Запустите скрапер и посмотрите результат

Вызовите функцию с URL плейлиста Spotify:

playlist_url = "https://open.spotify.com/album/7aJuG4TFXa2hmE4z1yxc3n?si=W7c1b1nNR3C7akuySGq_7g"
data = get_spotify_playlist_data(playlist_url)

for track in data:
    print(track)

Вы получите аккуратный список названий треков, исполнителей и длительности.

Шаг 6: Работа с официальным API Spotify

Для более чистого, легального и надёжного варианта используйте API Spotify. Требуется авторизация, но данные структурированы, и парсить HTML не нужно.

Как получить API-токен:

  1. Зарегистрируйте приложение на Spotify Developer Dashboard.
  2. Получите Client ID и Client Secret.
  3. Используйте этот код для получения токена доступа:
import requests
import base64

CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"

credentials = f"{CLIENT_ID}:{CLIENT_SECRET}"
encoded_credentials = base64.b64encode(credentials.encode()).decode()

url = "https://accounts.spotify.com/api/token"
headers = {
    "Authorization": f"Basic {encoded_credentials}",
    "Content-Type": "application/x-www-form-urlencoded"
}
data = {"grant_type": "client_credentials"}

response = requests.post(url, headers=headers, data=data)
token = response.json().get("access_token")

print("Access Token:", token)

С токеном можно получить данные напрямую:

artist_id = "6qqNVTkY8uBg9cP3Jd7DAH"
url = f"https://api.spotify.com/v1/artists/{artist_id}"
headers = {"Authorization": f"Bearer {token}"}

response = requests.get(url, headers=headers)
artist_data = response.json()

print(artist_data)

Шаг 7: Сохраняйте данные для последующего анализа

Сохраните полученные данные в JSON, чтобы потом легко их анализировать или делиться ими:

import json

with open('tracks.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

print("Данные сохранены в tracks.json")

Лучшие практики и этика

  • Всегда отдавайте предпочтение API Spotify, а не парсингу HTML — это стабильнее и уважает правила Spotify.
  • При парсинге не делайте слишком много запросов подряд, чтобы не перегружать сервер.
  • Проверьте файл robots.txt сайта перед скрапингом.
  • Если планируете масштабировать скрапинг, используйте прокси для избежания блокировок IP.
  • Уважайте интеллектуальную собственность Spotify и используйте данные ответственно.

Итог

Сбор данных Spotify — не только возможен, но и практичен. Используйте API или веб-скрапинг с Selenium и BeautifulSoup — Python сделает этот процесс простым и удобным.