Node.js İle Puppeteer Kullanarak Web Sayfası Otomasyonu Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Puppeteer ile çalışmaya başlamadan önce sisteminizde Node.js'in güncel bir LTS (Long Term Support) sürümünün yüklü olması gerekir. Projenizi başlatmak için bir terminal açın ve aşağıdaki adımları takip edin.

Öncelikle projeniz için bir klasör oluşturun ve gerekli bağımlılıkları yükleyin:

# Proje klasörünü oluşturun
mkdir puppeteer-otomasyon
cd puppeteer-otomasyon

# Node.js projesini başlatın
npm init -y

# Puppeteer kütüphanesini yükleyin
npm install puppeteer

Bu komutlar, projenizin temel yapılandırmasını oluşturur ve Puppeteer'ı projenize dahil eder. Puppeteer, kurulum sırasında Chromium'un uyumlu bir sürümünü otomatik olarak indirir, böylece harici bir tarayıcı kurulumuyla uğraşmanıza gerek kalmaz.

Puppeteer ile İlk Tarayıcı Otomasyonu

Otomasyonun temelinde bir tarayıcı örneği (browser instance) oluşturmak ve bu tarayıcı içinde yeni bir sayfa (page) açmak yatar. Aşağıdaki kod örneği, basit bir web sayfasını açıp ekran görüntüsünü almayı gösterir.

const puppeteer = require('puppeteer');

(async () => {
  // Tarayıcıyı başlat
  const browser = await puppeteer.launch({ headless: "new" });
  const page = await browser.newPage();
  
  // Belirli bir URL'ye git
  await page.goto('https://www.google.com');
  
  // Ekran görüntüsü al
  await page.screenshot({ path: 'google.png' });
  
  // Tarayıcıyı kapat
  await browser.close();
})();

Bu kodda headless: "new" parametresi, tarayıcının arka planda görünmez bir şekilde çalışmasını sağlar. Eğer süreci izlemek isterseniz bu değeri false yapabilirsiniz.

Web Sayfası Üzerinde Etkileşim Kurma

Otomasyonun gücü, sayfadaki öğelerle etkileşime girmekten gelir. Bir arama kutusuna yazı yazmak veya bir butona tıklamak için seçicileri (selectors) kullanırız. Puppeteer, CSS seçicilerini kullanarak sayfadaki öğeleri kolayca bulmanızı sağlar.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  
  await page.goto('https://example.com');
  
  // Bir input alanına değer yazma
  await page.type('#search-box', 'Node.js otomasyon');
  
  // Bir butona tıklama
  await page.click('#submit-button');
  
  // Sayfanın yüklenmesini bekle
  await page.waitForNavigation();
  
  await browser.close();
})();

page.type yöntemi, klavye olaylarını simüle eder. waitForNavigation ise sayfa yenilendikten sonra işlemin tamamlanmasını beklemek için kritik bir yöntemdir.

Veri Kazıma ve İçerik Okuma

Web sayfalarından veri çekmek (scraping), Puppeteer'ın en popüler kullanım alanlarından biridir. Sayfa içerisindeki DOM (Document Object Model) öğelerine erişerek metinleri veya nitelikleri (attributes) çekebilirsiniz.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://news.ycombinator.com');
  
  // Sayfadaki başlıkları çek
  const basliklar = await page.evaluate(() => {
    const listeler = Array.from(document.querySelectorAll('.titleline > a'));
    return listeler.map(a => a.innerText);
  });
  
  console.log(basliklar);
  await browser.close();
})();

page.evaluate fonksiyonu, tarayıcı bağlamında (context) JavaScript çalıştırmanıza olanak tanır. Burada tarayıcı içindeki document nesnesine doğrudan erişebilirsiniz.

Kritik Uyarı: Web sitelerinden veri çekerken, hedef sitenin robots.txt dosyasını ve kullanım şartlarını mutlaka kontrol edin. İzinsiz veri toplama, hukuki sorunlara yol açabilir ve IP adresinizin engellenmesine neden olabilir.

Puppeteer Otomasyon Yöntemleri Karşılaştırması

Yöntem Avantajı Dezavantajı
Headless Mod Hızlıdır, kaynak tüketimi düşüktür. Görsel hata ayıklama zordur.
Headful Mod Görsel takip ve hata ayıklama kolaydır. Daha fazla sistem kaynağı kullanır.
Evaluate Tarayıcı içinde hızlı veri işleme. Karmaşık mantıkta hata yönetimi zordur.

Hata Yönetimi ve Güvenli Kodlama

Otomasyon süreçleri, web sayfalarının değişmesi veya ağ hataları nedeniyle kesintiye uğrayabilir. Bu yüzden try-catch bloklarını kullanmak ve beklemeleri (waits) doğru yapılandırmak hayati önem taşır.

const puppeteer = require('puppeteer');

async function guvenliOtomasyon() {
  const browser = await puppeteer.launch();
  try {
    const page = await browser.newPage();
    await page.goto('https://example.com', { timeout: 30000 });
    
    // Elemanın yüklenmesini bekle
    await page.waitForSelector('.main-content', { timeout: 5000 });
    
    // İşlemler...
  } catch (error) {
    console.error('Otomasyon hatası:', error.message);
  } finally {
    await browser.close();
  }
}

guvenliOtomasyon();

timeout değerlerini belirlemek, uygulamanızın sonsuz döngüye girmesini veya askıda kalmasını engeller.

Güvenlik Notu: Puppeteer ile kullanıcı girişi gerektiren işlemleri otomatize ederken, şifreleri asla kod içerisinde düz metin olarak saklamayın. Çevresel değişkenler (environment variables) veya güvenli bir kasa (vault) kullanın.

Sıkça Sorulan Sorular

Puppeteer ile Selenium arasındaki fark nedir?

Puppeteer, özellikle Chrome ve Chromium için optimize edilmiştir ve Node.js ile çok daha hızlı çalışır. Selenium ise çoklu dil ve çoklu tarayıcı desteği sunar ancak kurulumu ve yapılandırması daha karmaşıktır.

Web sitesi beni engellerse ne yapmalıyım?

User-Agent bilgisini değiştirerek veya istek aralıklarına rastgele gecikmeler (delay) ekleyerek engellenme riskini azaltabilirsiniz. Ayrıca proxy servisleri kullanmak da bir çözümdür.

Puppeteer 2026 yılında hala popüler mi?

Evet, Puppeteer güncel güncellemeleri ve geniş topluluk desteği ile modern web otomasyonu için endüstri standardı olmaya devam etmektedir.

Headless modda neden ekran görüntüsü alamıyorum?

Genellikle sayfanın tam yüklenmemesinden kaynaklanır. waitUntil: 'networkidle0' parametresini page.goto içerisinde kullanarak ağ trafiğinin durmasını bekleyebilirsiniz.

Otomasyonu bir sunucuda nasıl çalıştırırım?

Sunucuda gerekli bağımlılıkları (Linux için gerekli kütüphaneler) kurduğunuzdan emin olun. Docker kullanarak Puppeteer ortamını izole bir şekilde çalıştırmak en güvenli yöntemdir.

Puppeteer ile Performans Optimizasyonu ve Kaynak Yönetimi

Puppeteer projeleri büyüdükçe, tarayıcı kaynaklarının verimli kullanılması kritik bir hale gelir. Özellikle çok sayıda sayfa açmanız gereken durumlarda bellek (RAM) kullanımı hızla artabilir. Performansı artırmak için şu stratejileri uygulayabilirsiniz:

  • Gereksiz Kaynakları Engelleme: Sayfa yüklenirken resimler, CSS dosyaları veya yazı tipleri (fonts) gibi otomasyonunuz için gerekli olmayan kaynakları yüklemeyerek bant genişliğinden tasarruf edin.
  • Browser Context Kullanımı: Her işlem için yeni bir tarayıcı başlatmak yerine, tek bir tarayıcı örneği içinde farklı browserContext yapıları oluşturun. Bu, izolasyonu korurken kaynak tüketimini ciddi oranda düşürür.
// Gereksiz kaynakları engelleyen örnek kod
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  
  await page.setRequestInterception(true);
  page.on('request', (req) => {
    if (['image', 'stylesheet', 'font'].includes(req.resourceType())) {
      req.abort();
    } else {
      req.continue();
    }
  });

  await page.goto('https://example.com');
  await browser.close();
})();

Puppeteer ile İleri Düzey Hata Ayıklama (Debugging) Teknikleri

Otomasyon senaryolarınız karmaşıklaştıkça, kodun neden başarısız olduğunu anlamak zorlaşabilir. Puppeteer, geliştirme sürecini kolaylaştıran güçlü hata ayıklama araçlarına sahiptir.

1. Görsel Hata Ayıklama

headless: false modunda çalışmak, tarayıcının neler yaptığını canlı izlemenizi sağlar. Ancak sunucu ortamlarında bu mümkün değildir. Bu durumda page.screenshot() metodunu hata anlarında tetikleyerek görsel loglar oluşturabilirsiniz.

2. Chrome DevTools Protokolü (CDP)

Puppeteer, Chrome'un kendi geliştirici araçlarıyla doğrudan konuşabilir. page.target().createCDPSession() kullanarak tarayıcının ağ trafiğini detaylıca inceleyebilir veya konsol çıktılarını anlık olarak terminale yansıtabilirsiniz.

// Konsol çıktılarını terminale yansıtma
page.on('console', msg => console.log('Tarayıcı Konsolu:', msg.text()));

// Ağ hatalarını yakalama
page.on('requestfailed', request => {
  console.log(`İstek başarısız oldu: ${request.url()} - Hata: ${request.failure().errorText}`);
});

3. Zaman Aşımı (Timeout) Yönetimi

Otomasyonlarda en sık karşılaşılan hata TimeoutError'dur. Varsayılan 30 saniyelik süreyi, yavaş çalışan web siteleri için page.setDefaultNavigationTimeout(60000) komutuyla global olarak artırabilir veya belirli eylemler için özel süreler tanımlayabilirsiniz.

Puppeteer Projelerini Docker ile Dağıtma

Puppeteer'ın yerel makinenizde çalışıp sunucuda çalışmamasının en büyük nedeni eksik kütüphanelerdir. Docker, tüm bağımlılıkları içeren bir imaj oluşturarak bu sorunu kökten çözer. Aşağıdaki Dockerfile örneği, Puppeteer için optimize edilmiş bir ortam sağlar:

FROM node:18-slim
RUN apt-get update && apt-get install -y \
    libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
    libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 \
    libxrandr2 libgbm1 libasound2
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "index.js"]

Bu yapılandırma ile otomasyonunuzu herhangi bir bulut sağlayıcısında (AWS, Google Cloud, DigitalOcean) sorunsuz bir şekilde çalıştırabilirsiniz.

Sonuç

Node.js ile Puppeteer kullanarak web sayfası otomasyonu yapmak, geliştirme süreçlerinizi hızlandıracak ve manuel tekrarlayan işleri ortadan kaldıracak güçlü bir yetenek setidir. Bu rehberde temel kurulumdan veri kazımaya, hata yönetiminden güvenlik pratiklerine kadar geniş bir yelpazeyi ele aldık. Bir sonraki adım olarak, Puppeteer ile kendi "headless" test araçlarınızı yazmayı veya verileri bir veritabanına otomatik kaydeden botlar geliştirmeyi deneyebilirsiniz. Başarılar dileriz.

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

Mutfak pratikleri ve organizasyonel hayat tüyoları üzerine uzman bir içerik üreticisiyim. Günlük rutinleri optimize eden yöntemleri, anlaşılır ve uygulanabilir rehberler haline getiriyorum.

Yorumlar (0)

Yorum Yaz