Scarnox · Blog

JavaScript ile oluşturulan web sitelerinden veri çekme

Birçok modern site, neredeyse boş bir HTML belgesi gönderir ve içeriği JavaScript ile tarayıcıda oluşturur. Scraper'ınız sayfayı çekip ürün, fiyat ya da makale metni bulamazsa, içerik oradadır ama geç gelir. Bu rehber sayfanın hangi türde olduğunu nasıl anlayacağınızı, varsa tarayıcıdan daha hızlı bir yol nasıl bulacağınızı ve Python'da Playwright ile render edilmiş sayfaları nasıl tarayacağınızı gösterir. Render edilmiş bir sayfa captcha gösterdiğinde ne yapılacağına dair bir notla biter.

Adım 1: içeriğin HTML'de olup olmadığını kontrol edin

Sayfayı tarayıcınızda view-source: ile açın ya da düz bir HTTP isteğiyle çekin ve ekranda gördüğünüz bir metni kaynakta arayın. Üç sonuç yaygındır:

Adım 2: varsa JSON endpoint'ini çağırın

Bir sayfa verisini bir endpoint'ten çekiyorsa, bu endpoint'i doğrudan çağırmak genellikle en iyi seçenektir. Render edilmiş sayfadan daha küçük, daha hızlı ve daha istikrarlıdır. İstek URL'sini kopyalayın, sitenin hangi başlıkları istediğini kontrol edin ve bir betikten deneyin. Bunu yalnızca sitenin kullanım koşullarına izin verdiği durumlarda yapın ve sitenin beklediği hız sınırlarına ya da kimlik doğrulamasına saygı gösterin. Belgelenmemiş bir endpoint habersiz değişebilir; bu yüzden ayrıştırıcınızı, yanıtın şekli değiştiğinde yüksek sesle hata verecek biçimde yazın.

Adım 3: gerekirse sayfayı render edin

İçeriğin gerçekten tarayıcı gerektirdiği durumda, headless bir tarayıcı sürün. Python için iyi bir seçim Playwright'tır. Aşağıdaki örnek bir ürün listesini açar, içeriğin görünmesini bekler ve her karttan metni okur:

from playwright.sync_api import sync_playwright

URL = "https://example.com/products"  # taramanıza izin verilen bir sayfa

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto(URL, wait_until="domcontentloaded", timeout=60_000)
    # Verinin geldiğini kanıtlayan öğeyi bekleyin.
    page.wait_for_selector(".product-card", timeout=30_000)
    titles = page.locator(".product-card h2").all_inner_texts()
    browser.close()

for title in titles:
    print(title)

Belirli bir seçiciyi beklemek, sabit bir sleep'ten çok daha güvenilirdir. Sabit bir duraklama ya yavaş bir günde çok kısa kalır ya da hızlı bir günde zaman kaybettirir. Yalnızca verinin yüklenmesinden sonra görünen öğeyi seçin.

Adım 4: sonsuz kaydırma ve sayfalamayı yönetin

Bazı sayfalar kaydırdıkça daha fazla öğe yükler. Sayfanın sonuna kaydırın, öğe sayısının artmasını bekleyin ve artmayı bıraktığında durun. Numaralı sayfalama daha basittir: sonraki sayfa bağlantısını bulun, takip edin ve son sayfada durun. Her zaman bir azami sayfa ya da kaydırma sayısı belirleyin; böylece bir hata tarayıcınızı sonsuza kadar çalıştırmaz.

def scroll_until_done(page, selector: str, max_rounds: int = 20) -> int:
    previous = -1
    for _ in range(max_rounds):
        count = page.locator(selector).count()
        if count == previous:
            break
        previous = count
        page.mouse.wheel(0, 4000)
        page.wait_for_timeout(1500)  # sonraki partinin yüklenmesi için zaman tanıyın
    return previous

Adım 5: tarayıcıyı ekonomik tutun

Render etmek pahalıdır. İhtiyacınız olmayan görselleri, yazı tiplerini ve medyayı engelleyin; her sayfa için yeni bir tarayıcı başlatmak yerine tek bir tarayıcıyı birçok sayfada yeniden kullanın. İşiniz bittiğinde sayfaları ve context'leri kapatın; böylece uzun bir çalıştırmada bellek artmaz.

def block_heavy_assets(route):
    if route.request.resource_type in ("image", "font", "media"):
        route.abort()
    else:
        route.continue_()

page.route("**/*", block_heavy_assets)

Adım 6: render edilmiş bir sayfa captcha gösterdiğinde

Bazen render edilmiş sayfa, herhangi bir içerik göstermeden önce bir captcha sunar. Bu captcha PopularCaptcha ise, Scarnox'taki canlı captcha tipi, sitekey'i sayfadan okursunuz, bir token istersiniz ve token'ı sitenin beklediği form alanına koyarsınız. PopularCaptcha Python rehberi bu adımı adım adım anlatır. Diğer widget'lar henüz canlı değil; bu yüzden bir plan yapmadan önce captcha tipleri açıklandı sayfasını kontrol edin.

Tarayıcının kendisine dikkat edin. Net biçimde otomatik görünen bir headless tarayıcı, daha fazla kontrolü tetikleyebilir, daha az değil. Dikkat edilecek sinyaller için headless tarayıcı tespiti sayfasını okuyun ve daha yavaş, daha az sayfa yüklemesini tercih edin.

Sorumlu scraping

Sonraki adımlar

Ücretsiz deneme kredisiyle başlayın, kart gerekmez: hesap oluşturun ve PopularCaptcha akışını kendi sahip olduğunuz bir sayfada test edin. Güncel fiyatlar için fiyatlandırma sayfasına bakın.