Jak zeskrobać dane ze Spotify za pomocą Pythona

Komentarze: 0

Dane list odtwarzania Spotify mogą być przydatne do zbierania informacji o utworach, wykonawcach i innych szczegółach utworów. Spotify nie zapewnia szczegółowego dostępu do niektórych danych bez klucza API, ale wykorzystując Playwright dla Pythona, możemy uzyskać dostęp do dynamicznej zawartości i wyodrębnić dane listy odtwarzania bezpośrednio ze strony internetowej Spotify. Ten artykuł ilustruje, jak zaimplementować Playwright do skrobania informacji, takich jak nazwy utworów, nazwy zespołów, linki i długości utworów z list odtwarzania Spotify.

Wymagania i instalacja

Aby rozpocząć, zainstaluj Playwright i lxml do obsługi dynamicznej zawartości strony i parsowania HTML:


pip install playwright
pip install lxml

Następnie, aby włączyć przeglądarki Playwright, użyj następującego polecenia, aby pobrać wymagane pliki binarne przeglądarki:


playwright install

Z tym przygotowaniem jesteśmy gotowi do scrapowania Spotify.

Proces scrapowania Spotify: Przewodnik krok po kroku

Zawartość Spotify jest ładowana dynamicznie, więc użycie `requests` lub innych prostych bibliotek HTTP nie pozwoli uchwycić wszystkich informacji renderowanych przez JavaScript. Playwright to biblioteka automatyzacji przeglądarki, która pozwala nam wchodzić w interakcję z dynamicznymi stronami internetowymi tak, jakbyśmy sami je przeglądali, co oznacza, że możemy poczekać na załadowanie JavaScriptu przed scrapowaniem.

Playwright obsługuje również konfigurację proxy, umożliwiając użycie różnych adresów IP w razie potrzeby, aby uniknąć limitów zapytań lub ograniczeń geograficznych na Spotify.

Poniżej znajdziesz szczegółowy przewodnik krok po kroku dotyczący scrapowania, wraz z przykładami kodu dla lepszego, bardziej wizualnego zrozumienia procesu.

Krok 1. Konfigurowanie funkcji do pobierania zawartości HTML

Funkcja `fetch_html_content` inicjalizuje środowisko Playwright, uruchamia przeglądarkę i przechodzi do adresu URL playlisty Spotify. Ustawiamy tutaj headless=False, aby interfejs przeglądarki pozostał widoczny (przydatne podczas debugowania); w przypadku zadań automatycznych ustawienie `True` przyspieszy wykonanie.

Parametr wait_until='networkidle' powoduje, że skrypt czeka na ustabilizowanie aktywności sieciowej przed przechwyceniem zawartości strony, co zapewnia prawidłowe załadowanie wszystkich elementów.


from playwright.async_api import async_playwright

async def fetch_html_content(playlist_url):
    async with async_playwright() as p:
        # W razie potrzeby uruchom przeglądarkę z konfiguracją serwera proxy.
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        # Przejdź do adresu URL
        await page.goto(playlist_url, wait_until='networkidle')

        # Odczekać, aż aktywność sieciowa ustabilizuje się
        await page.wait_for_timeout(3000)

        # Przechwytywanie zawartości strony
        page_content = await page.content()

        # Zamknij przeglądarkę
        await browser.close()

        return page_content


Aby używać proxy z uwierzytelnianiem adresu IP w Playwright, skonfiguruj funkcję uruchamiania w następujący sposób:


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

Spowoduje to przekierowanie żądań przez określony serwer proxy, maskując oryginalny adres IP i pomagając uniknąć potencjalnych ograniczeń związanych ze skrobaniem.

Krok 2. Analizowanie zawartości HTML

Za pomocą funkcji lxml fromstring tworzymy parser dla pobranej zawartości HTML. Pozwala nam to zlokalizować i wyodrębnić określone dane za pomocą wyrażeń XPath.


from lxml.html import fromstring

page_content = await fetch_html_content('https link')
parser = fromstring(page_content)

Krok 3. Wyodrębnianie informacji o ścieżce

Za pomocą selektorów XPath zbieramy następujące szczegóły dla każdego utworu na liście odtwarzania:

  1. Nazwy ścieżek;
  2. Adresy URL ścieżek;
  3. Nazwy artystów;
  4. Adresy URL artystów;
  5. Czas trwania utworów.

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

Listy adresów URL są uzupełniane domeną Spotify w celu utworzenia w pełni kwalifikowanych linków.

Krok 4. Zapisywanie danych do pliku CSV

Po zebraniu danych zapisujemy je w pliku CSV. Każdy wiersz w pliku zawiera nazwę utworu, adres URL utworu, nazwę wykonawcy, adres URL wykonawcy i czas trwania utworu.


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)
    # Nagłówek zapisu
    writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
    # Wiersze zapisu
    writer.writerows(rows)

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

Tworzy to dobrze ustrukturyzowany plik CSV, który można łatwo analizować i wykorzystywać w innych aplikacjach.

Pełny przykład kodu z obsługą proxy

Oto pełny kod, łączący wszystkie kroki usprawnionego procesu skrobania Spotify:


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:
        # Uruchom przeglądarkę z opcją proxy w razie potrzeby.
        browser = await p.chromium.launch(headless=False, proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"})
        page = await browser.new_page()

        # Przejdź do adresu URL
        await page.goto(playlist_url, wait_until='networkidle')
        
        # Poczekaj, aż aktywność sieciowa ustabilizuje się
        await page.wait_for_timeout(3000)
        
        # Przechwytywanie zawartości strony
        page_content = await page.content()

        # Zamknij przeglądarkę
        await browser.close()
        
        return page_content

page_content = asyncio.run(fetch_html_content('https link'))
parser = fromstring(page_content)


# Szczegóły wyciągu
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()')

# Zapis do 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}")

Zbieranie danych z list odtwarzania Spotify przy użyciu Pythona z Playwright umożliwia dostęp do dynamicznej zawartości w celu wyodrębniania i analizowania informacji o utworach. Konfigurując Playwright z serwerami proxy, możemy obsługiwać ograniczanie szybkości, tworząc niezawodny sposób gromadzenia danych z list odtwarzania. Ta konfiguracja otwiera możliwości szczegółowej analizy i może być łatwo dostosowana do innych typów treści Spotify.

Komentarze:

0 komentarze