Python kullanarak Spotify verileri nasıl kazınır

Yorumlar: 0

Spotify çalma listesi verileri, şarkılar, sanatçılar ve diğer parça ayrıntıları hakkında bilgi toplamak için yararlı olabilir. Spotify, API anahtarı olmadan bazı verilere ayrıntılı erişim sağlamaz, ancak Python için Playwright'tan yararlanarak dinamik içeriğe erişebilir ve çalma listesi verilerini doğrudan Spotify'ın web sitesinden çıkarabiliriz. Bu makale, Spotify çalma listelerinden parça adları, grup adları, bağlantılar ve parçaların uzunlukları gibi bilgileri kazımak için Playwright'ın nasıl uygulanacağını göstermektedir.

Gereksinimler ve kurulum

Başlamak için, dinamik sayfa içeriğini ve HTML ayrıştırmasını işlemek üzere Playwright ve lxml'yi yükleyin:


pip install playwright
pip install lxml

Ardından, Playwright tarayıcılarını etkinleştirmek için, gerekli tarayıcı ikili dosyalarını indirmek üzere aşağıdaki komutu kullanın:


playwright install

Bunlar ayarlandıktan sonra Spotify'ı kazımaya hazırız.

Spotify Kazıma İşlemi: Adım Adım Kılavuz

Spotify'ın içeriği dinamik olarak yüklenir, bu nedenle istekleri veya diğer basit HTTP kitaplıklarını kullanmak JavaScript tarafından işlenen tüm bilgileri yakalayamaz. Playwright, dinamik web siteleriyle sanki kendimiz geziniyormuşuz gibi etkileşim kurmamızı sağlayan bir tarayıcı otomasyon kütüphanesidir; bu da kazıma işleminden önce JavaScript'in yüklenmesini bekleyebileceğimiz anlamına gelir.

Playwright ayrıca proxy yapılandırmasını destekleyerek Spotify'da hız sınırlaması veya coğrafi kısıtlamalardan kaçınmak için gerekirse farklı IP'ler kullanmamızı sağlar.

Aşağıda, sürecin daha net ve görsel olarak anlaşılması için kod örnekleriyle birlikte ayrıntılı, adım adım bir kazıma kılavuzu bulacaksınız.

Adım 1. HTML içeriğini getirecek işlevi ayarlama

fetch_html_content işlevi Playwright ortamını başlatır, bir tarayıcı başlatır ve Spotify çalma listesi URL'sine gider. Burada, tarayıcı arayüzünün görünür kalması için headless=False olarak ayarladık (hata ayıklama için kullanışlıdır); otomatik görevler için True olarak ayarlamak yürütmeyi hızlandıracaktır.

wait_until='networkidle' seçeneği, sayfa içeriğini yakalamadan önce ağ etkinliğinin dengelenmesini bekler ve tüm öğelerin doğru yüklenmesini sağlar.


from playwright.async_api import async_playwright

async def fetch_html_content(playlist_url):
    async with async_playwright() as p:
        # Gerekirse proxy kurulumu ile tarayıcıyı başlatın
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        # URL'ye gidin
        await page.goto(playlist_url, wait_until='networkidle')

        # Ağ etkinliğinin yerleşmesi için zaman tanıyın
        await page.wait_for_timeout(3000)

        # Sayfa içeriğini yakalama
        page_content = await page.content()

        # Tarayıcıyı kapatın
        await browser.close()

        return page_content


Playwright'ta IP adresi kimlik doğrulamalı bir proxy kullanmak için başlatma işlevini aşağıdaki gibi yapılandırın:


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

Bu, istekleri belirtilen proxy sunucusu üzerinden yönlendirerek orijinal IP'nizi maskeler ve olası kazıma kısıtlamalarını önlemeye yardımcı olur.

Adım 2. HTML içeriğini ayrıştırma

lxml'nin fromstring fonksiyonu ile, getirilen HTML içeriği için bir ayrıştırıcı oluşturuyoruz. Bu, XPath ifadelerini kullanarak belirli verileri bulmamızı ve çıkarmamızı sağlar.


from lxml.html import fromstring

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

Adım 3. Parça bilgilerini çıkarma

XPath seçicileri ile çalma listesindeki her parça için aşağıdaki detayları topluyoruz:

  1. Parça Adları;
  2. URL'leri izleyin;
  3. Sanatçı İsimleri;
  4. Sanatçı URL'leri;
  5. Parça Süreleri.

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 listeleri, tam nitelikli bağlantılar oluşturmak için Spotify etki alanı ile tamamlanır.

Adım 4. Verileri bir CSV dosyasına kaydetme

Verileri topladıktan sonra bir CSV dosyasına yazıyoruz. Dosyadaki her satır parça adı, parça URL'si, sanatçı adı, sanatçı URL'si ve parça süresini içerir.


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)
    # Başlık yaz
    writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
    # Satırları yazın
    writer.writerows(rows)

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

Bu, analiz edilmesi ve diğer uygulamalarda kullanılması kolay, iyi yapılandırılmış bir CSV dosyası oluşturur.

Proxy desteği ile eksiksiz kod örneği

İşte, kolaylaştırılmış bir Spotify kazıma işlemi için tüm adımları birleştiren tam kod:


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:
        # Gerekirse proxy seçeneği ile tarayıcıyı başlatın
        browser = await p.chromium.launch(headless=False, proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"})
        page = await browser.new_page()

        # URL'ye gidin
        await page.goto(playlist_url, wait_until='networkidle')
        
        # Herhangi bir ağ etkinliğinin yerleşmesini bekleyin
        await page.wait_for_timeout(3000)
        
        # Sayfa içeriğini yakalama
        page_content = await page.content()

        # Tarayıcıyı kapatın
        await browser.close()
        
        return page_content

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


# Ayrıntıları çıkarın
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'ye yaz
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}")

Playwright ile Python kullanarak Spotify çalma listesi verilerini toplamak, parça bilgilerini çıkarmak ve analiz etmek için dinamik içeriğe erişim sağlar. Playwright'ı proxy'lerle yapılandırarak, çalma listesi verilerini toplamak için güvenilir bir yol oluşturarak hız sınırlamasını ele alabiliriz. Bu kurulum, ayrıntılı analiz için olanaklar sağlar ve diğer Spotify içerik türleri için kolayca uyarlanabilir.

Yorumlar:

0 yorumlar