Python İle Pyppeteer Kütüphanesi Kullanarak Web Sayfası Otomasyonu Nasıl Yapılır?

Python İle Pyppeteer Kütüphanesi Kullanarak Web Sayfası Otomasyonu Nasıl Yapılır?
Python İle Pyppeteer Kütüphanesi Kullanarak Web Sayfası Otomasyonu Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Pyppeteer ile çalışmaya başlamadan önce bilgisayarınızda Python 3.10 veya üzeri bir sürümün yüklü olması gerekir. Pyppeteer, asenkron bir yapıya sahip olduğu için asyncio kütüphanesi ile entegre çalışır. Kurulum için terminalinize şu komutu yazarak kütüphaneyi projenize dahil edebilirsiniz:

pip install pyppeteer

Kurulum tamamlandıktan sonra, Pyppeteer ilk çalıştırıldığında Chromium tarayıcısını otomatik olarak indirecektir. Eğer internet kısıtlaması olan bir ortamdaysanız, tarayıcıyı manuel olarak indirmeniz gerekebilir. Çalışma ortamınızı hazırladıktan sonra, temel otomasyon mantığını anlamak için ilk adımımıza geçebiliriz.

Tarayıcıyı Başlatma ve İlk Sayfayı Yükleme

Pyppeteer, tarayıcıyı bir "headless" (arayüzsüz) modda veya arayüzü görünür şekilde başlatabilir. Geliştirme aşamasında hataları görmek için arayüzü görünür tutmak (headless=False) büyük kolaylık sağlar. Aşağıdaki kod bloğu, tarayıcıyı başlatır, yeni bir sekme açar ve belirtilen URL'ye gider.

import asyncio
from pyppeteer import launch

async def main():
    # Tarayıcıyı başlat
    browser = await launch(headless=False)
    page = await browser.newPage()
    
    # Hedef sayfaya git
    await page.goto('https://www.google.com')
    
    # İşlem bittiğinde kapat
    await browser.close()

asyncio.run(main())

Bu örnekte launch fonksiyonu ile tarayıcıyı başlattık. await anahtar kelimesi, işlemin tamamlanmasını beklemek için kritik öneme sahiptir. Eğer await kullanmazsanız, kodunuz tarayıcı hazır olmadan bir sonraki satıra geçmeye çalışacak ve hata verecektir.

Web Sayfası Öğeleriyle Etkileşim Kurma

Otomasyonun temel amacı, kullanıcının tarayıcıda yaptığı işlemleri (tıklama, yazma, kaydırma) kod ile yapmaktır. Bir arama kutusuna yazı yazmak veya bir butona tıklamak için type ve click metodlarını kullanırız. Seçicileri (selectors) doğru belirlemek, otomasyonunuzun başarısı için hayati önem taşır.

async def arama_yap(page):
    await page.goto('https://www.google.com')
    # Arama kutusunu seç ve metin gir
    await page.type('textarea[name="q"]', 'Python otomasyon')
    # Enter tuşuna bas
    await page.keyboard.press('Enter')
    # Sayfanın yüklenmesini bekle
    await page.waitForNavigation()

Yukarıdaki kod, Google ana sayfasındaki arama kutusunu CSS seçicisi ile bulur ve içine metin yazar. waitForNavigation kullanımı, sayfa yenilendiğinde kodun bir sonraki adıma geçmeden önce yüklenmeyi beklemesini sağlar.

Ekran Görüntüsü Alma ve PDF Kaydetme

Otomasyon süreçlerinde, yapılan işlemlerin doğruluğunu kanıtlamak veya raporlamak için ekran görüntüsü almak çok yaygındır. Pyppeteer, sayfanın tam boyutlu veya belirli bir alanının görüntüsünü saniyeler içinde almanızı sağlar.

async def ekran_goruntusu_al(page):
    await page.goto('https://www.python.org')
    # Tüm sayfanın ekran görüntüsünü al
    await page.screenshot({'path': 'python_org.png', 'fullPage': True})
    # Sayfayı PDF olarak kaydet
    await page.pdf({'path': 'python_org.pdf', 'format': 'A4'})

Bu fonksiyon, belirtilen web sitesini ziyaret eder ve hem bir görsel dosyası hem de bir PDF dosyası oluşturur. fullPage: True parametresi, sayfanın sadece görünen kısmını değil, kaydırılabilir tüm içeriğini yakalamanızı sağlar.

Veri Kazıma: Sayfa İçeriğini Çekme

Web sayfalarındaki verileri analiz etmek veya başka bir sisteme aktarmak için sayfa içeriğini çekmemiz gerekir. evaluate fonksiyonu, tarayıcı içerisinde JavaScript çalıştırmanıza olanak tanır. Bu sayede sayfanın DOM (Document Object Model) yapısına erişebiliriz.

async def veri_cek(page):
    await page.goto('https://example.com')
    # Sayfa içindeki başlığı al
    baslik = await page.evaluate('() => document.querySelector("h1").innerText')
    print(f"Sayfa Başlığı: {baslik}")

Bu yöntem, Python ile JavaScript'in gücünü birleştirir. document.querySelector ile istediğimiz HTML elementini seçip, içeriğini Python değişkenine aktarabiliyoruz.

Otomasyon Yöntemlerinin Karşılaştırması

Yöntem Avantajı Dezavantajı
Pyppeteer Modern, asenkron, Chromium tabanlı RAM tüketimi yüksektir
Selenium Geniş tarayıcı desteği Daha yavaş ve eski yapı
Requests + BS4 Çok hızlı, hafif JavaScript'i işleyemez

Güvenlik Uyarısı: Web otomasyonu yaparken hedef sitelerin robots.txt dosyalarını kontrol edin. Kişisel verileri izinsiz çekmek, yasal sorumluluk doğurabilir. Ayrıca, giriş formlarında gerçek kullanıcı verilerini (şifre vb.) asla kod içerisinde açık metin olarak saklamayın; ortam değişkenlerini (environment variables) kullanın.

Sıkça Sorulan Sorular

Pyppeteer neden "await" kullanmamı istiyor?

Pyppeteer asenkron bir kütüphanedir. Tarayıcı ile iletişim ağ üzerinden veya yerel bir soket üzerinden gerçekleştiği için bu işlemler zaman alır. "Await" kullanarak, işlem tamamlanana kadar kodun beklemesini ve diğer işlemlerin engellenmemesini sağlıyoruz.

Headless modu nedir?

Headless modu, tarayıcının grafiksel arayüzünü (penceresini) açmadan arka planda çalışmasıdır. Sunucularda veya bulut ortamlarında kaynak tasarrufu sağlamak için tercih edilir.

Sayfa geç yüklenirse ne yapmalıyım?

page.waitForSelector('.class-adi') metodunu kullanarak belirli bir öğe DOM'a düşene kadar kodun beklemesini sağlayabilirsiniz. Bu, statik bekleme sürelerinden daha güvenilirdir.

Proxy kullanabilir miyim?

Evet, launch fonksiyonu içerisindeki args parametresi ile --proxy-server="http://ip:port" argümanını ekleyerek tarayıcıyı bir proxy üzerinden yönlendirebilirsiniz.

Pyppeteer ile giriş (login) nasıl yapılır?

Kullanıcı adı ve şifre alanlarını page.type ile doldurup, giriş butonuna page.click ile basmanız yeterlidir. Ancak, iki faktörlü doğrulama (2FA) gerektiren sitelerde otomasyon oldukça karmaşıklaşacaktır.

Pyppeteer ile İleri Seviye Hata Ayıklama Teknikleri

Otomasyon projeleriniz büyüdükçe, karmaşık web sayfalarında karşılaşılan hataları tespit etmek zorlaşabilir. Pyppeteer, tarayıcı ile doğrudan iletişim kurduğu için standart Python hata ayıklayıcılarından farklı yöntemler gerektirir.

Debugger Protokolü ile İnceleme

Tarayıcıyı devtools=True parametresiyle başlatmak, geliştirici araçlarını otomatik olarak açar. Bu, sayfa öğelerini görsel olarak incelemenize ve konsol çıktılarını anlık takip etmenize olanak tanır.

import asyncio
from pyppeteer import launch

async def debug_mode():
    browser = await launch(headless=False, devtools=True)
    page = await browser.newPage()
    await page.goto('https://www.google.com')
    # Tarayıcıyı açık tutmak için bekleme
    await asyncio.sleep(60)
    await browser.close()

asyncio.get_event_loop().run_until_complete(debug_mode())

Network İzleme ve Hata Yakalama

Sayfa yüklenirken oluşan 404 veya 500 hatalarını yakalamak, otomasyonun sürekliliği için kritiktir. page.on('requestfailed', ...) olay dinleyicisi ile ağ isteklerindeki hataları loglayabilirsiniz.

page.on('requestfailed', lambda req: print(f"İstek başarısız: {req.url} - Hata: {req.failure().get('errorText')}"))
page.on('response', lambda res: print(f"Yanıt alındı: {res.url} - Durum: {res.status}"))

Pyppeteer Projelerini Deployment Sürecine Hazırlama

Yerel bilgisayarınızda çalışan bir otomasyon betiğini sunucuya (Linux/Docker) taşırken bazı yapılandırmalar yapmanız gerekir. Özellikle "headless" sunucularda grafik arayüzü olmadığı için gerekli kütüphanelerin eksikliği hatalara yol açar.

Docker ve Linux Üzerinde Çalıştırma

Sunucularda Pyppeteer kullanırken, tarayıcının ihtiyaç duyduğu bağımlılıkları (Chromium kütüphaneleri) yüklemelisiniz. Ayrıca, --no-sandbox argümanını eklemek, güvenlik kısıtlamaları nedeniyle oluşabilecek hataları engeller.

browser = await launch(
    headless=True,
    args=['--no-sandbox', '--disable-setuid-sandbox']
)

Performans Optimizasyonu İçin İpuçları

Otomasyonun hızını artırmak ve kaynak tüketimini azaltmak için gereksiz yüklemeleri devre dışı bırakmak en etkili yöntemdir. Örneğin, resimlerin veya CSS dosyalarının yüklenmesini engelleyerek bant genişliğinden tasarruf edebilirsiniz.

Optimizasyon Etki
Resimleri Engelleme Sayfa yüklenme süresini %40'a kadar azaltır.
Gereksiz Scriptleri Durdurma CPU kullanımını düşürür.
Sayfa Önbelleği (Cache) Tekrarlayan ziyaretlerde hızı artırır.

Aşağıdaki kod bloğu, resim yüklemeyi devre dışı bırakarak sayfa açılış hızını optimize eder:

await page.setRequestInterception(True)
page.on('request', lambda req: asyncio.ensure_future(
    req.abort() if req.resourceType in ['image', 'media', 'font'] else req.continue_()
))

Sonuç

Python ile Pyppeteer kullanarak web otomasyonu yapmak, doğru yapılandırıldığında oldukça güçlü bir araçtır. Bu makalede tarayıcıyı başlatmayı, sayfalarla etkileşime girmeyi, veri çekmeyi ve ekran görüntüsü almayı öğrendiniz. Bir sonraki adım olarak, çoklu sekmelerle çalışmayı veya verileri bir veritabanına (SQLite gibi) kaydetmeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Web otomasyonu yaparken hedef web sitesinin kullanım koşullarına uymak ve etik sınırlar içerisinde kalmak kullanıcının sorumluluğundadır. Yasa dışı veri toplama veya sistemlere zarar verme faaliyetlerinden kaçınınız.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve evde pratik tamirat üzerine uzmanım. Detaylı rehberlerimle herkesin teknik becerilerini geliştirmesini amaçlıyorum.

Yorumlar (0)

Yorum Yaz