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.
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'ı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.
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.
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)
XPath seçicileri ile çalma listesindeki her parça için aşağıdaki detayları topluyoruz:
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.
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.
İş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