Gereksinimler ve Ön Hazırlık
Dinamik web kazıma işlemleri için temel Python bilgisine ek olarak, tarayıcıyı kontrol edebilen kütüphanelere ihtiyacımız vardır. 2026 yılı standartlarında en kararlı ve güçlü yöntem Playwright kütüphanesidir. Playwright, Chromium, Firefox ve WebKit tarayıcılarını programatik olarak yönetmenize olanak tanır.
Çalışma ortamınızı hazırlamak için terminalinizde aşağıdaki komutları çalıştırarak gerekli paketleri kurun:
pip install playwright
playwright install chromium
Bu komutlar, Python ortamınıza Playwright kütüphanesini ekleyecek ve tarayıcı motorlarını sisteminize indirecektir. Kurulumun başarıyla tamamlandığından emin olmak için bir Python dosyası oluşturup import playwright komutunu çalıştırarak hata almadığınızı kontrol edebilirsiniz.
Playwright ile İlk Dinamik Tarayıcı Otomasyonu
Dinamik web kazıma uygulamalarında ilk adım, tarayıcıyı başlatmak ve hedef sayfaya gitmektir. Statik kütüphanelerden farklı olarak Playwright, sayfanın tamamen yüklenmesini bekleyebilir. Aşağıdaki örnekte, basit bir sayfa açma işlemini görebilirsiniz.
from playwright.sync_api import sync_playwright
def baslat_tarayici():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://books.toscrape.com/")
print(page.title())
browser.close()
baslat_tarayici()
Burada headless=True parametresi, tarayıcının arka planda çalışmasını sağlar. Eğer süreci görsel olarak izlemek isterseniz bu değeri False yapabilirsiniz. page.goto komutu, belirtilen URL'ye gider ve sayfanın DOM yapısının hazır olmasını bekler.
Dinamik İçerikleri Bekleme ve Seçme Teknikleri
Dinamik sitelerde veriler genellikle bir API isteği sonrası veya kullanıcı etkileşimi ile gelir. Bu yüzden öğelerin yüklenmesini beklemek kritik bir adımdır. Playwright'ın wait_for_selector metodu, eleman DOM'a düşene kadar bekler.
from playwright.sync_api import sync_playwright
def veri_cek():
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://books.toscrape.com/")
# Belirli bir CSS seçicisinin yüklenmesini bekle
page.wait_for_selector(".product_pod")
kitaplar = page.query_selector_all(".product_pod")
for kitap in kitaplar:
baslik = kitap.query_selector("h3 a").get_attribute("title")
print(f"Kitap Adı: {baslik}")
browser.close()
veri_cek()
Bu kodda, query_selector_all metodu ile sayfadaki tüm kitap kartlarını bir liste olarak alıyoruz. Ardından her bir kartın içindeki başlık özniteliğini (title) çekiyoruz. Bu yöntem, sayfadaki tüm öğeleri döngü ile işlememize olanak tanır.
Veri Kazıma Yöntemlerinin Karşılaştırılması
Web kazıma dünyasında farklı araçlar farklı ihtiyaçlara hitap eder. Aşağıdaki tablo, Python ekosistemindeki popüler araçların karşılaştırmasını sunar.
| Yöntem | Hız | Dinamik İçerik Desteği | Zorluk Seviyesi |
|---|---|---|---|
| Requests + BeautifulSoup | Çok Yüksek | Yok | Düşük |
| Playwright | Orta | Tam | Orta |
| Selenium | Düşük | Tam | Yüksek |
Etkileşimli Sayfalarda İşlem Yapma
Bazı web sitelerinde veri, "Daha Fazla Yükle" butonuna tıklandığında gelir. Python ile bu etkileşimi simüle etmek oldukça basittir. page.click() fonksiyonu ile kullanıcı gibi davranabiliriz.
# Butona tıklama örneği
page.click("button#load-more")
# Yeni içeriğin yüklenmesi için kısa bir bekleme
page.wait_for_timeout(2000)
Bu yöntem, özellikle sonsuz kaydırma (infinite scroll) içeren sayfalarda veriyi tam olarak çekmek için kullanılır. Ancak, wait_for_timeout yerine mümkünse wait_for_selector gibi koşullu beklemeleri tercih etmelisiniz, çünkü bu daha kararlı bir çalışma sağlar.
Kritik Uyarı: Web kazıma yaparken hedef sitenin robots.txt dosyasını mutlaka kontrol edin. Aşırı hızlı istekler sitenin sunucularını yorabilir ve IP adresinizin engellenmesine neden olabilir. Her zaman etik kazıma kurallarına uyun.
Verileri Yapılandırma ve Kaydetme
Çekilen verileri ham metin olarak tutmak yerine, analiz edilebilir bir formatta (CSV veya JSON) saklamak en iyi pratiktir. Python'un yerleşik csv kütüphanesi bu iş için oldukça uygundur.
import csv
def veriyi_kaydet(veri_listesi):
with open('kitaplar.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Baslik', 'Fiyat'])
for veri in veri_listesi:
writer.writerow([veri['baslik'], veri['fiyat']])
# Kullanım örneği
veri = [{'baslik': 'Python Rehberi', 'fiyat': '100 TL'}]
veriyi_kaydet(veri)
Verileri CSV formatında kaydetmek, ileride bu verileri Excel veya Pandas kütüphanesi ile analiz etmenizi kolaylaştırır. Dosya işlemlerinde utf-8 kodlamasını kullanmak, Türkçe karakter sorunlarını önlemek için hayati önem taşır.
Sıkça Sorulan Sorular
Web kazıma yasal mı?
Halka açık verilerin kazınması genellikle yasaldır ancak kişisel verilerin (KVKK kapsamında) toplanması veya telif hakkı içeren içeriklerin ticari amaçla izinsiz kullanımı yasal sorunlar doğurabilir. Her zaman yerel yasaları göz önünde bulundurun.
Neden Selenium yerine Playwright tercih etmeliyim?
Playwright, modern web uygulamaları için daha hızlıdır, otomatik beklemeleri daha iyi yönetir ve kurulumu daha basittir. 2026 standartlarında geliştirici deneyimi açısından çok daha verimlidir.
IP engellemesini nasıl aşabilirim?
İstekler arasında rastgele süreler (time.sleep) bırakarak ve proxy servisleri kullanarak engellenme riskini azaltabilirsiniz. Ancak gerçek kullanıcı davranışını taklit etmek en etkili yöntemdir.
Dinamik içerik nedir?
Dinamik içerik, sayfa yüklendikten sonra JavaScript aracılığıyla sunucudan çekilen verilerdir. Kaynak koduna baktığınızda bu verileri göremezsiniz, tarayıcıda ise görürsünüz.
Headless modu nedir?
Headless modu, tarayıcının grafik arayüzü (penceresi) olmadan arka planda çalışmasıdır. Bu, sunucu ortamlarında (headless server) kaynak tasarrufu sağlar ve daha hızlı çalışır.
Güvenlik Sorumluluk Reddi: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Web kazıma uygulamalarınızda kullanıcı verilerini asla kötüye kullanmayın, SQL injection veya XSS gibi güvenlik açıklarına yol açabilecek verileri işlemeden önce mutlaka temizleyin (sanitization). Sistem güvenliğinden kullanıcı sorumludur.
Web Kazıma Projelerinde Performans Optimizasyonu
Dinamik web kazıma projeleri büyüdükçe, tarayıcı kaynaklarının yönetimi ve ağ trafiğinin optimize edilmesi kritik bir hale gelir. Playwright ile performansınızı artırmak için tarayıcıyı sadece ihtiyacınız olan veriyi alacak şekilde yapılandırmanız gerekir.
Gereksiz Kaynakların Engellenmesi
Sayfa yüklenirken resimler, CSS dosyaları veya yazı tipleri (fonts) gibi görsel öğeler, veriyi çekme hızınızı yavaşlatır. Bu öğeleri yüklemeyerek hem bant genişliğinden tasarruf edebilir hem de kazıma süresini ciddi oranda düşürebilirsiniz.
from playwright.sync_api import sync_playwright
def run():
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context()
page = context.new_page()
# Resim ve CSS yüklenmesini engelleyerek hızı artırın
page.route("**/*", lambda route: route.abort() if route.request.resource_type in ["image", "stylesheet", "font"] else route.continue_())
page.goto("https://orneksite.com")
print(page.title())
browser.close()
run()
Üretim Ortamında Hata Ayıklama (Debugging) Stratejileri
Canlıya alınan veya karmaşık yapılara sahip sitelerde kazıma işlemi bazen beklenmedik şekilde kesilebilir. Hata ayıklama sürecini yönetmek için Playwright'ın sunduğu yerleşik araçları kullanmak, sorunun kaynağını saniyeler içinde bulmanızı sağlar.
Trace Viewer Kullanımı
Trace Viewer, kazıma işleminizin her adımını görsel bir kayıt gibi incelemenize olanak tanır. Hangi satırda hata aldığınızı, o anki DOM yapısını ve ağ isteklerini detaylıca görebilirsiniz.
# Trace kaydını başlatmak için
context.tracing.start(screenshots=True, snapshots=True, sources=True)
# Kazıma işlemlerini gerçekleştirin
page.goto("https://orneksite.com")
# Hata oluştuğunda veya işlem bittiğinde kaydı durdurun
context.tracing.stop(path="trace.zip")
Hata Yakalama (Exception Handling)
Kazıma sırasında ağ bağlantısının kopması veya seçicilerin (selectors) değişmesi gibi durumlar için mutlaka try-except blokları kullanmalısınız. Aşağıdaki örnek, bir element bulunamadığında uygulamanın çökmesini engeller:
from playwright.sync_api import TimeoutError
try:
page.wait_for_selector(".urun-fiyati", timeout=5000)
fiyat = page.inner_text(".urun-fiyati")
except TimeoutError:
print("Hata: Element zaman aşımına uğradı, sayfa yapısı değişmiş olabilir.")
except Exception as e:
print(f"Beklenmedik bir hata oluştu: {e}")
İpucu: Büyük ölçekli kazıma projelerinde, her zaman rastgele "User-Agent" başlıkları kullanarak ve istekler arasına time.sleep() ile rastgele gecikmeler ekleyerek sunucular tarafından engellenme riskinizi minimize edin.
Sonuç
Python ile dinamik web kazıma uygulaması geliştirmek, doğru araçları seçtiğinizde oldukça verimli ve güçlü bir süreçtir. Playwright kütüphanesi ile modern web sayfalarının karmaşık yapısını aşabilir ve ihtiyacınız olan veriye güvenle ulaşabilirsiniz. Adım adım ilerleyerek kurduğunuz bu temel yapı, üzerine ekleyebileceğiniz veritabanı entegrasyonları veya veri görselleştirme araçları ile çok daha kapsamlı bir projeye dönüşebilir.
Bir sonraki adım olarak, topladığınız verileri bir SQL veritabanına kaydeden veya çektiğiniz verileri otomatik olarak e-posta ile raporlayan bir "veri boru hattı" (data pipeline) oluşturmayı deneyebilirsiniz. Yazılım dünyasında sürekli güncel kalmak ve pratik yapmak, sizi her zaman bir adım öne taşıyacaktır.


Yorumlar (0)
Yorum Yaz