Python İle Dinamik Bir Web Kazıma Uygulaması Nasıl Yapılır?

Python İle Dinamik Bir Web Kazıma Uygulaması Nasıl Yapılır?
Python İle Dinamik Bir Web Kazıma Uygulaması Nasıl Yapılır?

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.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz