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.txtdosyaları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.

Yorumlar (0)
Yorum Yaz