Spotify є ключовим ресурсом для аналізу музичних тенденцій завдяки великій колекції треків, артистів і плейлистів. Однак отримання доступу до даних вимагає використання API-ключа, який може бути недоступний більшості користувачів. Як альтернатива, цей посібник демонструє застосування Playwright у Python для доступу до динамічно завантажуваного контенту Spotify і скрапінгу таких даних, як назви треків, виконавців, посилань на треки та їхню тривалість прямо з веб-сайту. Використовуючи цей метод, можна ефективно збирати дані для музичного аналізу, моніторингу тенденцій або створення персоналізованих рекомендацій.
Для початку встановіть Playwright і lxml для обробки динамічного вмісту сторінки та парсингу HTML:
pip install playwright
pip install lxml
Потім, щоб активувати браузери Playwright, використовуйте таку команду для завантаження необхідних бінарних файлів браузера:
playwright install
Після встановлення цих компонентів ми готові почати скрапінг Spotify.
Дані Spotify завантажуються динамічно, що робить незастосовними прості HTTP-бібліотеки, такі як requests, для повного захоплення інформації, активованої JavaScript. У цих умовах Playwright виступає як інструмент автоматизації браузера, імітуючи призначену для користувача взаємодію і дозволяючи скриптам дочекатися повного завантаження динамічного контенту перед витяганням даних.
Playwright розширює можливості скрапінгу через налаштування проксі, що забезпечує зміну IP-адрес для подолання обмежень за частотою запитів і географічних блокувань на Spotify.
Далі представлено детальний посібник із прикладами коду, що демонструє кожен крок процесу скрапінгу для забезпечення глибшого розуміння методу.
Функція 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 і допомагаючи уникнути потенційних обмежень під час скрапінгу.
За допомогою функції fromstring з бібліотеки lxml створюється парсер для отриманого HTML-вмісту. Це дає змогу знайти та витягти конкретні дані з використанням виразів XPath.
from lxml.html import fromstring
page_content = await fetch_html_content('https ссылка')
parser = fromstring(page_content)
За допомогою селекторів XPath збираються такі деталі для кожного треку в плейлисті:
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 для створення абсолютних посилань.
Після збору даних вони записуються в 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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Коментарі: 0