PYTHON // WEB SCRAPINGD::02 BAŞLANGIÇ+
15m READCOMPLETION: 94%ID::PY-101

PLAYWRIGHT İLE MODERN WEB SCRAPING

Headless browser ile dinamik web sitelerinden veri çekimi

Playwright, Microsoft tarafından geliştirilen modern bir headless browser otomasyon kütüphanesidir. Statik HTML'i scrape eden BeautifulSoup veya Requests'ten farklı olarak Playwright, JavaScript ile render edilen dinamik içerikleri de yakalayabilir.

Neden Playwright?

Geleneksel HTTP-tabanlı araçlar React, Vue ya da Angular ile oluşturulmuş SPA'larda işe yaramaz çünkü sunucudan gelen HTML boştur. Playwright gerçek bir Chromium/Firefox/WebKit başlatır ve JS yürütüldükten sonra DOM'a erişir.

Kurulum

İlk Scraping Script'i

// PYTHON //
import asyncio
from playwright.async_api import async_playwright
 
async def scrape(url: str) -> str:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
 
        await page.goto(url)
        # JavaScript yüklenmesini bekle
        await page.wait_for_load_state("networkidle")
 
        content = await page.inner_text("body")
        await browser.close()
        return content
 
result = asyncio.run(scrape("https://example.com"))
print(result[:500])

Element Seçiciler

Playwright dört farklı seçici stratejisi sunar:

StratejiÖrnekKullanım Durumu
CSSpage.locator("h1")Genel seçimler
XPathpage.locator("xpath=//div")Karmaşık yapılar
Rolepage.get_by_role("button")Erişilebilirlik
Textpage.get_by_text("Giriş")Görünen metin
// PYTHON //
# CSS seçici
title = await page.locator("h1.product-title").inner_text()
 
# Visibility bekle
await page.locator(".product-list").wait_for(state="visible")
 
# Role tabanlı (en güvenilir yöntem)
await page.get_by_role("button", name="Sepete Ekle").click()

Dinamik İçerik ve Bekleme

// PYTHON //
async def wait_and_scrape(url: str) -> list[str]:
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
        await page.goto(url)
 
        # Belirli element yüklenene dek bekle
        await page.wait_for_selector(".item-card", timeout=15_000)
 
        # Tüm kartların metinlerini topla
        items = page.locator(".item-card")
        texts = []
        for i in range(await items.count()):
            text = await items.nth(i).inner_text()
            texts.append(text.strip())
 
        await browser.close()
        return texts

JavaScript ile Veri Çekimi

Bazen Python tarafından DOM'a doğrudan erişmek daha verimlidir:

// PYTHON //
products = await page.evaluate("""() => {
    return Array.from(document.querySelectorAll('.product')).map(el => ({
        name:  el.querySelector('h3')?.textContent?.trim(),
        price: el.querySelector('.price')?.textContent?.trim(),
        href:  el.querySelector('a')?.href,
    }));
}""")

Etik Scraping ve Rate Limiting

// PYTHON //
import asyncio, random
 
async def polite_scrape(urls: list[str]) -> list[str]:
    results = []
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
 
        for url in urls:
            await page.goto(url)
            await page.wait_for_load_state("networkidle")
            results.append(await page.content())
 
            # İstekler arası rastgele bekleme
            await asyncio.sleep(random.uniform(1.5, 3.5))
 
        await browser.close()
    return results

Proxy ve User-Agent Yönetimi

// PYTHON //
async with async_playwright() as p:
    browser = await p.chromium.launch(
        proxy={"server": "http://myproxy:8080"},
    )
    context = await browser.new_context(
        user_agent=(
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/120.0 Safari/537.36"
        ),
    )
    page = await context.new_page()

Ekran Görüntüsü ve Hata Ayıklama

Sonuç

Playwright, modern web scraping'de Selenium'un yerini almaktadır. Async API'si, güçlü bekleme mekanizmaları ve çoklu tarayıcı desteği ile üretim kalitesinde otomasyon scriptleri yazmanızı sağlar. Bir sonraki derste kazınan verileri CSV ve SQLite'a aktarmayı göreceğiz.