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
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 ]) KOPYALA
Element Seçiciler
Playwright dört farklı seçici stratejisi sunar:
Strateji Örnek Kullanım Durumu CSS page.locator("h1") Genel seçimler XPath page.locator("xpath=//div") Karmaşık yapılar Role page.get_by_role("button") Erişilebilirlik Text page.get_by_text("Giriş") Görünen metin
# 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 () KOPYALA
Dinamik İçerik ve Bekleme
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 KOPYALA
JavaScript ile Veri Çekimi
Bazen Python tarafından DOM'a doğrudan erişmek daha verimlidir:
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,
}));
}""" ) KOPYALA
Etik Scraping ve Rate Limiting
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 KOPYALA
Proxy ve User-Agent Yönetimi
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 () KOPYALA
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.