Руководство по извлечению данных из Spotify с помощью Python

Комментарии: 0

Spotify является ключевым ресурсом для анализа музыкальных тенденций благодаря обширной коллекции треков, артистов и плейлистов. Однако получение доступа к данным требует использования API-ключа, который может быть недоступен большинству пользователей. В качестве альтернативы, данное руководство демонстрирует применение Playwright в Python для доступа к динамически загружаемому контенту Spotify и скрапинга таких данных, как названия треков, исполнителей, ссылок на треки и их продолжительность прямо с веб-сайта. Используя этот метод, можно эффективно собирать данные для музыкального анализа, мониторинга тенденций или создания персонализированных рекомендаций.

Установка необходимых библиотек

Для начала установите Playwright и lxml для обработки динамического содержимого страницы и парсинга HTML:


pip install playwright
pip install lxml

Затем, чтобы активировать браузеры Playwright, используйте следующую команду для загрузки необходимых бинарных файлов браузера:


playwright install

После установки этих компонентов мы готовы начать скрапинг Spotify.

Процесс скрапинга Spotify: пошаговая инструкция

Данные Spotify загружаются динамически, что делает неприменимыми простые HTTP-библиотеки, такие как requests, для полного захвата информации, активированной JavaScript. В этих условиях Playwright выступает как инструмент автоматизации браузера, имитируя пользовательское взаимодействие и позволяя скриптам дождаться полной загрузки динамического контента перед извлечением данных.

Playwright расширяет возможности скрапинга через настройку прокси, что обеспечивает смену IP-адресов для преодоления ограничений по частоте запросов и географических блокировок на Spotify.

Далее представлено детальное руководство с примерами кода, демонстрирующее каждый шаг процесса скрапинга для обеспечения более глубокого понимания метода.

Шаг 1. Настройка функции для извлечения HTML-содержимого

Функция fetch_html_content инициализирует среду Playwright, запускает браузер и переходит по URL-адресу плейлиста Spotify. Здесь параметр headless установлен в False, что позволяет видеть интерфейс браузера (полезно для отладки); для автоматизированных задач установка его в True ускорит выполнение.

Опция wait_until='networkidle' ожидает стабилизации сетевой активности перед захватом содержимого страницы, обеспечивая корректную загрузку всех элементов.


from playwright.async_api import async_playwright

async def fetch_html_content(playlist_url):
    async with async_playwright() as p:
        # Запуск браузера с настройкой прокси при необходимости
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        # Переход по URL
        await page.goto(playlist_url, wait_until='networkidle')

        # Ожидание для стабилизации сетевой активности
        await page.wait_for_timeout(3000)

        # Получение содержимого страницы
        page_content = await page.content()

        # Закрытие браузера
        await browser.close()

        return page_content

Для использования прокси с авторизацией по IP-адресу с Playwright настройте функцию запуска следующим образом:


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

Это позволит направлять запросы через указанный прокси-сервер, маскируя ваш настоящий IP и помогая избежать потенциальных ограничений при скрапинге.

Шаг 2. Парсинг HTML-содержимого

С помощью функции fromstring из библиотеки lxml создается парсер для полученного HTML-содержимого. Это позволяет найти и извлечь конкретные данные с использованием выражений XPath.


from lxml.html import fromstring

page_content = await fetch_html_content('https ссылка')
parser = fromstring(page_content)

Шаг 3. Извлечение информации о треках

С помощью селекторов XPath собираются следующие детали для каждого трека в плейлисте:

  • Названия;
  • URL;
  • Имена артистов;
  • URL артистов;
  • Длительности треков.

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

Списки URL дополняются доменом Spotify для создания абсолютных ссылок.

Шаг 4. Сохранение данных в CSV-файл

После сбора данных они записываются в CSV-файл. Каждая строка файла содержит название трека, URL трека, имя исполнителя, URL исполнителя и длительность трека.


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)
    # Запись заголовка
    writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
    # Запись строк
    writer.writerows(rows)

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

Это создает хорошо структурированный CSV-файл, который легко анализировать и использовать в дальнейших операциях.

Полная версия кода

Ниже представлена полная версия кода с комментариями:


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:
        # Запуск браузера с настройкой прокси с авторизацией по логину и паролю
        browser = await p.chromium.launch(headless=False, proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"})
        page = await browser.new_page()

        # Переход по URL
        await page.goto(playlist_url, wait_until='networkidle')
        
        # Ожидание для стабилизации сетевой активности
        await page.wait_for_timeout(3000)
        
        # Получение контента страницы
        page_content = await page.content()

        # Закрытие браузера
        await browser.close()
        
        return page_content

page_content = asyncio.run(fetch_html_content('https ссылка'))
parser = fromstring(page_content)


# Извлечение данных о треках
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()')

# Запись данных в 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}")

Сбор данных плейлистов Spotify с помощью Python и Playwright позволяет получать доступ к динамическому контенту для извлечения и анализа информации о треках. Настройка Playwright с использованием прокси позволяет управлять ограничениями по частоте запросов, создавая надежный способ сбора данных плейлистов. Эта конфигурация открывает возможности для детального анализа и может быть легко адаптирована для работы с другими типами контента Spotify.

Комментарии:

0 комментариев