Посібник із вилучення даних зі 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 Коментаріїв