Python İle Pyppeteer Kütüphanesi Kullanarak Web Sayfası Ekran Görüntüsü Nasıl Yapılır?

Python İle Pyppeteer Kütüphanesi Kullanarak Web Sayfası Ekran Görüntüsü Nasıl Yapılır?
Python İle Pyppeteer Kütüphanesi Kullanarak Web Sayfası Ekran Görüntüsü Nasıl Yapılır?

Gereksinimler ve Ortam Kurulumu

Pyppeteer ile çalışmaya başlamadan önce Python 3.9 veya daha yeni bir sürümün yüklü olması önerilir. Pyppeteer, kendi Chromium sürümünü otomatik olarak indirebilen bir yapıya sahiptir, bu nedenle harici bir tarayıcı sürücüsü kurmanıza gerek kalmaz.

Projenizi başlatmak için terminalinizde aşağıdaki komutu kullanarak kütüphaneyi yükleyin:

pip install pyppeteer

Kurulum tamamlandıktan sonra, kütüphanenin düzgün çalışıp çalışmadığını doğrulamak için boş bir Python dosyası oluşturup import pyppeteer komutunu çalıştırabilirsiniz. Eğer herhangi bir hata almadıysanız, temel kurulumunuz tamamlanmış demektir.

İlk Ekran Görüntüsü Alma Uygulaması

Pyppeteer'da ekran görüntüsü alma süreci; tarayıcıyı başlatma, bir sayfa (page) açma, URL'ye gitme ve screenshot metodunu çağırma şeklinde ilerler. Bu işlem, asenkron (eşzamansız) bir yapıya sahip olduğu için asyncio kütüphanesini kullanmamız gerekir.

import asyncio
from pyppeteer import launch

async def ekran_goruntusu_al():
    # Tarayıcıyı başlat
    browser = await launch()
    page = await browser.newPage()
    
    # Hedef sayfaya git
    await page.goto('https://www.google.com')
    
    # Ekran görüntüsünü kaydet
    await page.screenshot({'path': 'google_ekran.png'})
    
    # Tarayıcıyı kapat
    await browser.close()

asyncio.get_event_loop().run_until_complete(ekran_goruntusu_al())

Yukarıdaki kod, varsayılan ayarlarla bir Chromium örneği açar ve belirtilen adrese giderek ekran görüntüsünü google_ekran.png ismiyle kaydeder. await anahtar kelimesi, işlemin tamamlanmasını beklerken diğer süreçlerin bloklanmamasını sağlar.

Sayfa Boyutlarını ve Görünümü Özelleştirme

Varsayılan tarayıcı boyutu genellikle 800x600 pikseldir. Modern web siteleri duyarlı (responsive) tasarıma sahip olduğu için, belirli bir ekran çözünürlüğünde görüntü almak isteyebilirsiniz. setViewport metodu ile bu ayarı kolayca yapabilirsiniz.

async def ozel_boyutlu_ekran_goruntusu():
    browser = await launch()
    page = await browser.newPage()
    
    # Ekran boyutunu ayarla
    await page.setViewport({'width': 1920, 'height': 1080})
    
    await page.goto('https://www.python.org')
    await page.screenshot({'path': 'python_org_full.png'})
    
    await browser.close()

Bu yöntem, özellikle bir web sitesinin masaüstü görünümünde nasıl göründüğünü test etmek istediğinizde kritik öneme sahiptir. Eğer fullPage=True parametresini eklerseniz, sayfanın sadece görünen kısmını değil, tüm uzunluğunu (scroll edilen kısımlar dahil) kaydedebilirsiniz.

Seçici (Selector) Kullanarak Belirli Alanları Yakalama

Bazen tüm sayfayı değil, sadece belirli bir HTML öğesinin (örneğin bir grafik veya bir içerik kutusu) ekran görüntüsünü almak isteyebilirsiniz. Pyppeteer, CSS seçicilerini kullanarak bu işlemi saniyeler içinde gerçekleştirmenize olanak tanır.

async def belirli_alan_yakala():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.wikipedia.org')
    
    # Belirli bir CSS elementini seç
    element = await page.querySelector('.central-featured')
    
    # Sadece o elementin ekran görüntüsünü al
    await element.screenshot({'path': 'wiki_ozel_alan.png'})
    
    await browser.close()

Bu yöntem, web kazıma projelerinde verileri görselleştirirken veya sadece belirli bir bileşenin güncel durumunu takip ederken oldukça kullanışlıdır. querySelector, sayfadaki ilk eşleşen öğeyi döndürür.

Ekran Görüntüsü Alma Yöntemlerinin Karşılaştırılması

Yöntem Avantaj Dezavantaj
Tam Sayfa Sayfanın tamamını arşivler Dosya boyutu büyük olabilir
Görünen Alan Hızlıdır, kullanıcı deneyimini yansıtır Sayfanın alt kısımları görünmez
Element Bazlı Odaklanmış veri sunar Elementin sayfada olması gerekir

Güvenlik ve Performans İpuçları

Web otomasyonu yaparken tarayıcıyı "headless" (başsız - arayüzsüz) modda çalıştırmak, kaynak tüketimini ciddi oranda düşürür. Ayrıca, sitelerin bot olduğunuzu anlamaması için kullanıcı ajanı (User-Agent) bilgisi eklemek iyi bir pratiktir.

async def guvenli_tarayici():
    browser = await launch(headless=True)
    page = await browser.newPage()
    
    # Bot tespitini engellemek için User-Agent ekle
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
    
    await page.goto('https://example.com')
    await page.screenshot({'path': 'guvenli_kayit.png'})
    await browser.close()

Kritik Uyarı: Web sayfalarından veri çekerken veya ekran görüntüsü alırken ilgili web sitesinin robots.txt dosyasını ve kullanım koşullarını mutlaka inceleyin. İzinsiz veri toplama ve yoğun istek gönderme, IP adresinizin engellenmesine veya yasal sorumluluk doğurmasına neden olabilir. Kodlarınızı her zaman etik sınırlar içerisinde çalıştırın.

Sıkça Sorulan Sorular

Pyppeteer ile neden ekran görüntüsü alırken hata alıyorum?

Genellikle bu durum, Chromium'un indirilmemesinden veya sayfanın tamamen yüklenmeden ekran görüntüsü alınmaya çalışılmasından kaynaklanır. await page.waitForNavigation() veya await page.waitForTimeout(2000) kullanarak sayfanın yüklenmesini beklemeyi deneyin.

Headless modu nedir, neden kullanmalıyım?

Headless modu, tarayıcının grafik arayüzü olmadan arka planda çalışmasıdır. Sunucu taraflı projelerde (Docker, Linux sunucular vb.) grafik arayüzü olmadığı için headless mod zorunludur ve bellek kullanımını minimize eder.

Tüm sayfayı (scroll dahil) nasıl alabilirim?

screenshot fonksiyonuna fullPage=True parametresini ekleyerek sayfanın en üstünden en altına kadar olan tüm içeriği tek bir görselde birleştirebilirsiniz.

Pyppeteer ile giriş yapmam gereken sitelerde ekran görüntüsü alabilir miyim?

Evet, page.type() ve page.click() metodlarını kullanarak giriş formlarını doldurabilir, ardından oturum açılmış sayfada ekran görüntüsü alabilirsiniz.

Bu kütüphane 2026 yılında hala güncel mi?

Evet, Pyppeteer Chromium tabanlı yapısını koruduğu sürece web otomasyonu için geçerli ve güçlü bir araçtır. Ancak çok karmaşık projelerde Playwright gibi daha yeni kütüphaneler de değerlendirilebilir.

İleri Seviye Senaryo: Dinamik İçerik ve Bekleme Stratejileri

Web sayfalarının çoğu artık AJAX veya JavaScript tabanlı içerik yükleme yöntemlerini kullanmaktadır. Sayfa yüklendiği anda ekran görüntüsü alırsanız, henüz render edilmemiş boş alanlar veya eksik verilerle karşılaşabilirsiniz. Pyppeteer'da bu sorunu aşmak için "bekleme" stratejilerini doğru yapılandırmanız gerekir.

Belirli Bir Elementin Yüklenmesini Beklemek

Sayfanın tamamının yüklenmesini beklemek yerine, ekran görüntüsünü almadan önce kritik bir elementin DOM'a eklenmesini beklemek çok daha performanslıdır. waitForSelector metodu bu noktada hayat kurtarıcıdır.

import asyncio
from pyppeteer import launch

async def screenshot_with_wait():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://ornek-site.com')
    
    # Belirli bir butonun veya içerik kutusunun yüklenmesini bekle
    await page.waitForSelector('.data-container', {'timeout': 5000})
    
    await page.screenshot({'path': 'dinamik_icerik.png'})
    await browser.close()

asyncio.get_event_loop().run_until_complete(screenshot_with_wait())

Üretim Ortamında (Deployment) Karşılaşılan Sorunlar ve Çözümleri

Yerel bilgisayarınızda kusursuz çalışan kodunuz, Docker veya Linux sunucularında (özellikle headless modda) "sandbox" hataları verebilir. Bu durum genellikle Chromium'un ihtiyaç duyduğu bazı kütüphanelerin eksikliğinden kaynaklanır.

Linux Sunucularında Gerekli Bağımlılıklar

Ubuntu veya Debian tabanlı bir sunucuda Pyppeteer'ı sorunsuz çalıştırmak için aşağıdaki paketlerin yüklü olduğundan emin olmalısınız:

  • libx11-xcb1: X11 pencere sistemi için gereklidir.
  • libxcomposite1: Grafiksel arayüz bileşenleri için kullanılır.
  • libxcursor1: İmleç yönetimi için gereklidir.
  • libxdamage1: Ekran güncellemelerini yönetir.
  • libxi6: Giriş cihazları için gereklidir.

Ayrıca, güvenlik nedeniyle root kullanıcısı ile çalıştırmanız gerekiyorsa, args parametresine --no-sandbox seçeneğini eklemeyi unutmayın:

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

Bellek Yönetimi ve Performans Optimizasyonu

Eğer aynı anda onlarca ekran görüntüsü almanız gereken bir bot yazıyorsanız, her seferinde yeni bir tarayıcı örneği başlatmak yerine tarayıcıyı bir kez başlatıp sayfaları (pages) kapatıp açarak ilerlemek bellek kullanımını ciddi oranda düşürecektir. page.close() metodunu her işlem sonunda çağırmak, bellek sızıntılarını (memory leaks) engellemek için kritik öneme sahiptir.

Sonuç

Python ile Pyppeteer kullanarak web sayfası ekran görüntüsü almak, otomasyon projeleriniz için oldukça esnek ve güçlü bir yetenektir. Bu rehberde, kurulumdan başlayarak element bazlı ekran görüntüsü almaya kadar gerekli tüm teknik adımları inceledik. Bir sonraki adım olarak, aldığınız bu ekran görüntülerini otomatik olarak bir veritabanına veya bulut depolama alanına yükleyen bir pipeline (iş hattı) kurmayı deneyebilirsiniz. Başarılar dileriz.

Bu yazıya tepkinizi paylaşın:
Deniz Arslan

On yıldır pratik ev çözümleri ve hayat kolaylaştıran teknikler üzerine içerik üretiyorum. Okuyucuların karmaşık süreçleri en basit adımlarla çözmelerine yardımcı oluyorum.

Yorumlar (0)

Yorum Yaz