Cara mengikis data Spotify menggunakan Python

Komentar: 0

Data daftar putar Spotify dapat berguna untuk mengumpulkan informasi tentang lagu, artis, dan detail lagu lainnya. Spotify tidak menyediakan akses terperinci ke beberapa data tanpa kunci API, tetapi dengan memanfaatkan Playwright untuk Python, kita dapat mengakses konten dinamis dan mengekstrak data daftar putar langsung dari situs web Spotify. Artikel ini mengilustrasikan cara mengimplementasikan Playwright untuk mengambil informasi seperti nama lagu, nama band, tautan, dan panjang lagu dari daftar putar Spotify.

Persyaratan dan pemasangan

Untuk memulai, instal Playwright dan lxml untuk menangani konten halaman dinamis dan penguraian HTML:


pip install playwright
pip install lxml

Kemudian, untuk mengaktifkan peramban Playwright, gunakan perintah berikut untuk mengunduh binari peramban yang diperlukan:


playwright install

Dengan pengaturan ini, kami siap untuk mengikis Spotify.

Proses Pengikisan Spotify: Panduan Langkah-demi-Langkah

Konten Spotify dimuat secara dinamis, jadi menggunakan request atau pustaka HTTP sederhana lainnya tidak akan menangkap semua informasi yang diberikan oleh JavaScript. Playwright adalah pustaka otomatisasi peramban yang memungkinkan kita berinteraksi dengan situs web dinamis seolah-olah kita menjelajahinya sendiri, yang berarti kita dapat menunggu JavaScript dimuat sebelum melakukan scraping.

Playwright juga mendukung konfigurasi proxy, sehingga kita dapat menggunakan IP yang berbeda jika diperlukan untuk menghindari pembatasan kecepatan atau pembatasan geografis di Spotify.

Di bawah ini, Anda akan menemukan panduan langkah demi langkah yang mendetail untuk melakukan scraping, lengkap dengan contoh kode untuk pemahaman yang lebih jelas dan visual tentang prosesnya.

Langkah 1. Menyiapkan fungsi untuk mengambil konten HTML

Fungsi fetch_html_content menginisialisasi lingkungan Playwright, meluncurkan peramban, dan menavigasi ke URL daftar putar Spotify. Di sini, kami menetapkan headless=False agar antarmuka peramban tetap terlihat (berguna untuk debugging); untuk tugas otomatis, menetapkannya ke True akan mempercepat eksekusi.

Opsi wait_until='networkidle' menunggu aktivitas jaringan menjadi stabil sebelum mengambil konten halaman, untuk memastikan semua elemen dimuat dengan benar.


from playwright.async_api import async_playwright

async def fetch_html_content(playlist_url):
    async with async_playwright() as p:
        # Luncurkan browser dengan pengaturan proxy jika diperlukan
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        # Arahkan ke URL
        await page.goto(playlist_url, wait_until='networkidle')

        # Berikan waktu untuk menyelesaikan aktivitas jaringan
        await page.wait_for_timeout(3000)

        # Menangkap konten halaman
        page_content = await page.content()

        # Tutup browser
        await browser.close()

        return page_content


Untuk menggunakan proxy dengan autentikasi alamat IP di Playwright, konfigurasikan fungsi peluncuran sebagai berikut:


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

Ini akan merutekan permintaan melalui server proxy yang ditentukan, menyembunyikan IP asli Anda dan membantu menghindari potensi pembatasan scraping.

Langkah 2. Mengurai konten HTML

Dengan fungsi fromstring dari lxml, kita membuat parser untuk konten HTML yang diambil. Hal ini memungkinkan kita untuk menemukan dan mengekstrak data tertentu menggunakan ekspresi XPath.


from lxml.html import fromstring

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

Langkah 3. Mengekstrak informasi trek

Dengan pemilih XPath, kami mengumpulkan detail berikut untuk setiap trek dalam daftar putar:

  1. Nama Track;
  2. Url Track;
  3. Nama Artis;
  4. URL Artis;
  5. Durasi Lagu.

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

Daftar URL dilengkapi dengan domain Spotify untuk membuat tautan yang memenuhi syarat.

Langkah 4. Menyimpan data ke file CSV

Setelah mengumpulkan data, kami menuliskannya ke dalam file CSV. Setiap baris dalam file tersebut berisi nama lagu, URL lagu, nama artis, URL artis, dan durasi lagu.


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)
    # Tulis tajuk
    writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
    # Menulis baris
    writer.writerows(rows)

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

Hal ini menciptakan file CSV yang terstruktur dengan baik yang mudah dianalisis dan digunakan dalam aplikasi lebih lanjut.

Contoh kode lengkap dengan dukungan proxy

Berikut ini adalah kode lengkapnya, yang menggabungkan semua langkah untuk proses pengikisan Spotify yang efisien:


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:
        # Luncurkan browser, dengan opsi proxy jika diperlukan
        browser = await p.chromium.launch(headless=False, proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"})
        page = await browser.new_page()

        # Arahkan ke URL
        await page.goto(playlist_url, wait_until='networkidle')
        
        # Tunggu hingga aktivitas jaringan selesai
        await page.wait_for_timeout(3000)
        
        # Menangkap konten halaman
        page_content = await page.content()

        # Menutup browser
        await browser.close()
        
        return page_content

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


# Detail ekstrak
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()')

# Menulis ke 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}")

Mengumpulkan data daftar putar Spotify menggunakan Python dengan Playwright memungkinkan akses ke konten dinamis untuk mengekstraksi dan menganalisis informasi trek. Dengan mengonfigurasi Playwright dengan proksi, kita dapat menangani pembatasan laju, menciptakan cara yang andal untuk mengumpulkan data daftar putar. Penyiapan ini membuka kemungkinan untuk analisis terperinci dan dapat dengan mudah diadaptasi untuk jenis konten Spotify lainnya.

Komentar:

0 komentar