Puppeteer ile Headless Chrome Üzerinde Kolay Kontrol: Kapsamlı Bir Rehber
Dijital dünyada otomasyonun önemi her geçen gün artmaktadır. Web sayfalarından veri çekme (web scraping), otomatik testler, PDF oluşturma, ekran görüntüsü alma gibi birçok işlem, manuel olarak yapıldığında hem zaman alıcı hem de hataya açık olabilir. İşte tam da bu noktada, tarayıcı otomasyon araçları devreye girer. Bu araçlar arasında özellikle öne çıkan ikili, Google’ın Headless Chrome’u ve Node.js için geliştirilmiş güçlü kütüphanesi Puppeteer’dır. Bu makale, Puppeteer’ın ne olduğunu, Headless Chrome ile nasıl entegre çalıştığını ve bu ikilinin sunduğu sınırsız olanakları detaylı bir şekilde ele almayı amaçlamaktadır. Puppeteer’ın kurulumundan başlayarak, temel kullanım senaryolarından ileri düzey tekniklere kadar geniş bir yelpazede bilgi sunacak, kod örnekleri ve en iyi uygulamalarla okuyuculara kapsamlı bir rehber olacaktır.
Puppeteer ve Headless Chrome’un Temelleri
Puppeteer ve Headless Chrome, modern web otomasyonu ve test süreçlerinin temel taşlarından ikisidir. Bu ikiliyi anlamak, web tabanlı projelerinizde verimliliği artırmanın ve karmaşık görevleri otomatikleştirmenin kapılarını aralar.
Headless Chrome Nedir?
Geleneksel bir web tarayıcısı, kullanıcıların bir web sitesini görsel olarak deneyimlemesini sağlayan bir grafik kullanıcı arayüzüne (GUI) sahiptir. Ancak bazı senaryolarda, tarayıcının görsel arayüzüne ihtiyacımız olmaz; sadece arka planda web sayfalarını işleme yeteneğine gereksinim duyarız. İşte Headless Chrome tam da bu ihtiyaca cevap verir. Headless Chrome, Google Chrome tarayıcısının GUI’si olmadan, yani “başsız” modda çalışabilen bir sürümüdür. Bu modda çalışırken, tarayıcı arka planda bir sunucu ortamında veya komut satırından çalıştırılabilir, web sayfalarını yükleyebilir, JavaScript kodlarını çalıştırabilir ve DOM’u manipüle edebilir.
Headless Chrome’un başlıca avantajları şunlardır:
- Performans: GUI’nin olmaması, tarayıcının daha az sistem kaynağı tüketmesini ve daha hızlı çalışmasını sağlar. Bu, özellikle büyük ölçekli otomasyon görevlerinde veya sürekli entegrasyon (CI) ortamlarında kritik bir avantajdır.
- Otomasyon: Web testleri, ekran görüntüsü alma, PDF oluşturma, web içeriği kazıma gibi görevler için idealdir.
- Sunucu Ortamları: GUI’nin bulunmadığı sunucu ortamlarında kolayca dağıtılabilir ve çalıştırılabilir.
- Güvenlik: Görsel bir arayüz olmaması, belirli güvenlik risklerini azaltabilir (her ne kadar tarayıcının kendisi güvenlik açıkları içerebilse de).
Headless Chrome, özellikle web geliştiricileri, QA mühendisleri ve veri bilimcileri için vazgeçilmez bir araç haline gelmiştir.
Puppeteer Nedir?
Puppeteer, Google Chrome ekibi tarafından geliştirilen bir Node.js kütüphanesidir. Adından da anlaşılacağı gibi, “kuklacı” anlamına gelir ve bir kukla gibi Headless Chrome veya Chromium’u programatik olarak kontrol etmenizi sağlar. Puppeteer, Chrome DevTools Protokolü üzerinden tarayıcı ile iletişim kurar. Bu protokol, tarayıcının iç işleyişine derinlemesine erişim sağlayarak, sayfa gezintisi, DOM manipülasyonu, JavaScript yürütme, ağ isteklerini engelleme ve daha fazlası gibi geniş bir yelpazede kontrol imkanı sunar.
Puppeteer’ın temel özellikleri ve yetenekleri:
- Sayfa Gezinimi: URL’lere gitme, ileri/geri navigasyon, sayfa yüklemelerini bekleme.
- DOM Etkileşimi: Elementleri seçme, metin ve niteliklerini alma, form alanlarını doldurma, butonlara tıklama.
- Ekran Görüntüsü ve PDF Oluşturma: Web sayfalarının tam veya belirli bölümlerinin ekran görüntüsünü alma, web sayfalarını PDF olarak kaydetme.
- Otomatik Testler: Kullanıcı etkileşimlerini simüle ederek uçtan uca (end-to-end) testler yazma.
- Ağ İzleme: Ağ isteklerini ve yanıtlarını engelleme, değiştirme veya izleme.
- Kullanıcı Aracısı ve Görünüm Ayarları: Tarayıcının kullanıcı aracısını (User-Agent) değiştirme, farklı ekran boyutlarını simüle etme.
- JavaScript Yürütme: Sayfa bağlamında özel JavaScript kodları çalıştırma.
Puppeteer, Node.js ekosisteminde çalışan geliştiriciler için Headless Chrome’un gücünü kolayca kullanmalarını sağlayan modern, güçlü ve iyi belgelenmiş bir kütüphanedir. Kurulumu basit, kullanımı sezgiseldir ve geniş bir topluluk desteğine sahiptir.
Puppeteer Kurulumu ve İlk Adımlar
Puppeteer ile çalışmaya başlamak oldukça basittir. Temel gereksinimler Node.js ve npm’dir. Eğer sisteminizde Node.js yüklü değilse, nodejs.org adresinden indirip kurmanız gerekmektedir.
Puppeteer Kurulumu
Bir Node.js projesi oluşturduktan sonra, projenizin kök dizininde aşağıdaki komutu çalıştırarak Puppeteer’ı kurabilirsiniz:
npm install puppeteer
Bu komut, Puppeteer kütüphanesini ve onunla birlikte uyumlu bir Chromium sürümünü indirip projenize ekleyecektir. Chromium’un indirilmesi, internet bağlantınızın hızına bağlı olarak biraz zaman alabilir.
Basit Bir “Hello World” Örneği: Ekran Görüntüsü Alma
Şimdi Puppeteer’ın temel işlevselliğini gösteren basit bir örnekle başlayalım. Bu örnekte, belirli bir web sitesine gidecek, sayfanın bir ekran görüntüsünü alacak ve tarayıcıyı kapatacağız. Bu, Puppeteer ile yapabileceğiniz en temel işlemlerden biridir.
Örnek kodu screenshot.js adında bir dosyaya kaydedelim:
const puppeteer = require('puppeteer');
async function takeScreenshot() {
// 1. Bir tarayıcı örneği başlat
const browser = await puppeteer.launch(); // Varsayılan olarak headless: true
// 2. Yeni bir sayfa aç
const page = await browser.newPage();
// 3. Belirli bir URL'ye git
await page.goto('https://www.example.com');
// 4. Sayfanın ekran görüntüsünü al
await page.screenshot({ path: 'example.png' });
// 5. Tarayıcıyı kapat
await browser.close();
console.log('Ekran görüntüsü başarıyla alındı: example.png');
}
takeScreenshot();
Bu kodu çalıştırmak için terminalinizde aşağıdaki komutu kullanın:
node screenshot.js
Komut başarıyla tamamlandığında, projenizin dizininde example.png adında bir dosya oluştuğunu göreceksiniz. Bu dosya, https://www.example.com adresinin ekran görüntüsünü içerecektir.
Şimdi kodun her adımını açıklayalım:
const puppeteer = require('puppeteer');: Puppeteer kütüphanesini projenize dahil eder.async function takeScreenshot() { ... }: Asenkron bir fonksiyon tanımlarız çünkü Puppeteer’ın çoğu işlemi asenkrondur veawaitanahtar kelimesi ile beklememiz gerekir.const browser = await puppeteer.launch();: Yeni bir Chromium tarayıcı örneği başlatır. Varsayılan olarak bu, başsız (headless) modda çalışır. Eğer tarayıcının görsel arayüzünü görmek isterseniz,puppeteer.launch({ headless: false })şeklinde kullanabilirsiniz.const page = await browser.newPage();: Başlatılan tarayıcı içinde yeni bir sekme veya sayfa açar. Puppeteer ile birden fazla sayfa üzerinde eş zamanlı olarak çalışabilirsiniz.await page.goto('https://www.example.com');: Açılan sayfayı belirtilen URL’ye yönlendirir. Bu işlem, sayfa tamamen yüklenene kadar bekler.await page.screenshot({ path: 'example.png' });: Geçerli sayfanın ekran görüntüsünü alır ve belirtilen yola kaydeder.pathparametresi dosya adını ve konumunu belirler.await browser.close();: İşlem tamamlandıktan sonra tarayıcı örneğini kapatır. Bu adım, kaynakların serbest bırakılması için çok önemlidir.
Bu basit örnek, Puppeteer’ın gücüne bir başlangıç niteliğindedir. Bir sonraki bölümde, Puppeteer’ın daha gelişmiş kullanım senaryolarını ve yeteneklerini keşfedeceğiz.
Puppeteer ile Gelişmiş Kullanım Senaryoları
Puppeteer’ın gerçek gücü, sadece ekran görüntüsü almaktan çok daha fazlasını yapabilmesinde yatar. Web sayfalarıyla etkileşim kurma, veri çekme, form doldurma ve otomatik testler gibi karmaşık görevleri kolayca otomatikleştirebilir.
Web Sayfası İçeriği Çekme (Web Scraping)
Web scraping, web sitelerinden yapılandırılmış veri çekme işlemidir. Puppeteer, JavaScript ile dinamik olarak yüklenen içeriklere sahip modern web sitelerinden veri çekmek için mükemmel bir araçtır.
const puppeteer = require('puppeteer');
async function scrapeProducts() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.hepsiburada.com/laptop-c-300300'); // Örnek bir e-ticaret sayfası
// Sayfanın yüklenmesini ve belirli bir elementin görünmesini bekle
await page.waitForSelector('.productListContent-zAP0s5Qef_qYJ4uzgpnJ');
// page.evaluate ile tarayıcı bağlamında JavaScript kodu çalıştır
const products = await page.evaluate(() => {
const productElements = Array.from(document.querySelectorAll('.productListContent-zAP0s5Qef_qYJ4uzgpnJ > li'));
return productElements.map(product => {
const title = product.querySelector('[data-test-id="product-card-name"]')?.innerText.trim();
const price = product.querySelector('[data-test-id="price-box"]')?.innerText.trim();
const imageUrl = product.querySelector('img[data-test-id="product-image"]')?.src;
return { title, price, imageUrl };
}).filter(p => p.title && p.price); // Başlık ve fiyatı olmayanları filtrele
});
console.log(products);
await browser.close();
}
scrapeProducts();
Bu örnek, Hepsiburada gibi bir e-ticaret sitesinden ürün başlıklarını, fiyatlarını ve resim URL’lerini çekmeye çalışır. page.waitForSelector ile içeriğin yüklendiğinden emin oluruz. page.evaluate methodu, tarayıcının DOM’u üzerinde doğrudan JavaScript çalıştırmamızı sağlar. Burada, querySelectorAll ile ürün elementlerini seçer ve her bir ürün için gerekli bilgileri toplarız.
Form Doldurma ve Etkileşim
Puppeteer, web formlarını otomatik olarak doldurmak ve butonlara tıklamak için kullanılabilir. Bu, oturum açma işlemleri, kayıt formları veya arama işlemleri gibi görevler için idealdir.
const puppeteer = require('puppeteer');
async function fillForm() {
const browser = await puppeteer.launch({ headless: false }); // İşlemi görmek için headless: false
const page = await browser.newPage();
await page.goto('https://www.google.com'); // Google arama sayfasını ziyaret et
// Arama kutusunu bul ve metin gir
await page.type('textarea[name="q"]', 'Puppeteer ile otomasyon');
// Arama butonuna tıkla (veya enter tuşuna bas)
await Promise.all([
page.waitForNavigation(), // Sayfa yüklenene kadar bekle
page.keyboard.press('Enter') // Enter tuşuna bas
// Alternatif olarak: await page.click('input[name="btnK"]'); // Arama butonuna tıkla
]);
// Arama sonuç sayfasının ekran görüntüsünü al
await page.screenshot({ path: 'google_search_results.png' });
await browser.close();
console.log('Google araması yapıldı ve ekran görüntüsü alındı.');
}
fillForm();
Bu örnekte, Google arama sayfasındaki arama kutusuna metin girilir ve ardından arama başlatılır. page.type belirli bir seçiciye sahip input alanına metin girmek için kullanılır. page.keyboard.press('Enter') klavye etkileşimini simüle eder. page.waitForNavigation() yeni sayfanın yüklenmesini beklemek için kritik öneme sahiptir.
Otomatik Testler (E2E Testing)
Puppeteer, bir uygulamanın uçtan uca testlerini otomatikleştirmek için mükemmel bir araçtır. Kullanıcı akışlarını simüle edebilir ve beklenen sonuçları doğrulayabilir.
const puppeteer = require('puppeteer');
const assert = require('assert'); // Doğrulama için Node.js'in dahili assert modülü
async function runLoginTest() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
try {
await page.goto('http://localhost:3000/login'); // Test edeceğiniz uygulamanın giriş sayfası
// Kullanıcı adı ve şifre alanlarını doldur
await page.type('#username', 'testuser');
await page.type('#password', 'password123');
// Giriş butonuna tıkla ve sayfa navigasyonunu bekle
await Promise.all([
page.waitForNavigation(),
page.click('#loginButton')
]);
// Giriş sonrası bir elementin varlığını kontrol et
const welcomeMessage = await page.$eval('.welcome-message', el => el.innerText);
assert.strictEqual(welcomeMessage, 'Hoş Geldiniz, testuser!', 'Giriş başarılı mesajı yanlış.');
console.log('Giriş testi BAŞARILI!');
} catch (error) {
console.error('Giriş testi BAŞARISIZ:', error);
await page.screenshot({ path: 'login_fail_error.png' }); // Hata durumunda ekran görüntüsü al
} finally {
await browser.close();
}
}
// runLoginTest(); // Bu testi çalıştırmak için yerel bir giriş sayfası kurmanız gerekir.
Bu örnek, bir giriş akışını test eder. Kullanıcı adı ve şifre girilir, giriş butonuna tıklanır ve ardından giriş sonrası sayfada beklenen bir mesajın varlığı ve içeriği kontrol edilir. assert modülü, test sonuçlarını doğrulamak için kullanılır. Hata yönetimi için try-catch-finally blokları, testin güvenilirliğini artırır.
PDF Oluşturma
Web sayfalarını PDF formatında kaydetmek, raporlama veya arşivleme gibi birçok senaryoda kullanışlıdır. Puppeteer, bu işlemi kolayca yapmanızı sağlar.
const puppeteer = require('puppeteer');
async function createPdf() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://tr.wikipedia.org/wiki/Puppeteer', { waitUntil: 'networkidle0' }); // Tüm ağ isteklerinin bitmesini bekle
await page.pdf({
path: 'puppeteer_wiki.pdf',
format: 'A4',
printBackground: true, // Arka plan renklerini ve resimlerini yazdır
margin: {
top: '1cm',
right: '1cm',
bottom: '1cm',
left: '1cm'
}
});
await browser.close();
console.log('PDF başarıyla oluşturuldu: puppeteer_wiki.pdf');
}
createPdf();
page.pdf() fonksiyonu, çeşitli seçeneklerle PDF çıktısı almanızı sağlar. format, printBackground ve margin gibi özellikler, çıktının görünümünü özelleştirmek için kullanılabilir. waitUntil: 'networkidle0' parametresi, sayfanın ve tüm alt kaynaklarının (resimler, CSS, JS) tamamen yüklenmesini bekleyerek daha doğru bir PDF çıktısı alınmasını sağlar.
Ekran Görüntüsü Alma (Screenshot)
Daha önce basit bir ekran görüntüsü alma örneği görmüştük. Puppeteer, ekran görüntüleri için daha fazla esneklik sunar.
const puppeteer = require('puppeteer');
async function takeAdvancedScreenshots() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setViewport({ width: 1280, height: 800 }); // Belirli bir görüntü alanı ayarla
await page.goto('https://www.google.com');
// Tam sayfanın ekran görüntüsünü al
await page.screenshot({ path: 'google_full_page.png', fullPage: true });
// Belirli bir elementin ekran görüntüsünü al
const searchBox = await page.$('textarea[name="q"]');
await searchBox.screenshot({ path: 'google_search_box.png' });
await browser.close();
console.log('Gelişmiş ekran görüntüleri alındı.');
}
takeAdvancedScreenshots();
Bu örnekte, page.setViewport ile tarayıcının görüntü alanı (viewport) ayarlanır. fullPage: true parametresi, sayfanın tamamının (kaydırılabilir içerik dahil) ekran görüntüsünü almanızı sağlar. Ayrıca, page.$() ile belirli bir DOM elementini seçip, o elementin kendi screenshot() methodunu kullanarak sadece o elementin ekran görüntüsünü alabilirsiniz.
Tek Sayfalı Uygulamaları (SPA) İşleme
Modern web uygulamalarının çoğu, JavaScript ile dinamik olarak içerik yükleyen Tek Sayfalı Uygulamalar (SPA) olarak tasarlanmıştır. Puppeteer, bu tür uygulamaları işlemek için özel bekleme stratejileri sunar.
const puppeteer = require('puppeteer');
async function handleSPA() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://react-redux.realworld.io/'); // Örnek bir SPA
// Bir elementin yüklenmesini bekle
await page.waitForSelector('.article-preview:first-child');
// İlk makalenin başlığını al
const firstArticleTitle = await page.$eval('.article-preview:first-child h1', el => el.innerText);
console.log('İlk makale başlığı:', firstArticleTitle);
// Bir sonraki sayfaya gitmek için butona tıkla (pagination)
await Promise.all([
page.waitForNavigation({ waitUntil: 'networkidle0' }), // Tüm ağ isteklerinin bitmesini bekle
page.click('.page-item:nth-child(3) > .page-link') // Sayfalandırma butonuna tıkla
]);
// Yeni sayfadaki ilk makalenin başlığını al
const newFirstArticleTitle = await page.$eval('.article-preview:first-child h1', el => el.innerText);
console.log('Yeni sayfadaki ilk makale başlığı:', newFirstArticleTitle);
await browser.close();
}
handleSPA();
page.waitForSelector belirli bir DOM elementinin sayfada görünmesini beklerken, page.waitForNavigation URL değişikliği veya tam sayfa yenilemesi gibi navigasyon olaylarını bekler. waitUntil: 'networkidle0' seçeneği, sayfanın tüm ağ etkinlikleri durana kadar bekleyerek, JavaScript tarafından dinamik olarak yüklenen tüm içeriğin mevcut olduğundan emin olmanızı sağlar.
Tarayıcı Ayarları ve Performans Optimizasyonu
Puppeteer, tarayıcı davranışını ve performansını etkileyen çeşitli ayarları yapılandırmanıza olanak tanır.
const puppeteer = require('puppeteer');
async function configureBrowser() {
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox', // Docker gibi ortamlarda gerekli olabilir
'--disable-setuid-sandbox',
'--disable-infobars', // "Chrome is being controlled by automated test software" mesajını gizler
'--window-size=1920,1080' // Başlangıç pencere boyutunu ayarla
]
});
const page = await browser.newPage();
// Kullanıcı aracısını değiştirme
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 PuppeteerBot');
// Görünüm alanını (viewport) ayarlama
await page.setViewport({ width: 1920, height: 1080 });
// Ağ isteklerini engelleme (örneğin resimleri veya CSS'i)
await page.setRequestInterception(true);
page.on('request', (request) => {
if (['image', 'stylesheet', 'font'].includes(request.resourceType())) {
request.abort(); // Resim, CSS ve font isteklerini engelle
} else {
request.continue();
}
});
await page.goto('https://www.google.com'); // Daha hızlı yüklenmesi beklenir
await page.screenshot({ path: 'optimized_google.png' });
await browser.close();
console.log('Tarayıcı ayarları yapılandırıldı ve optimize edilmiş ekran görüntüsü alındı.');
}
configureBrowser();
puppeteer.launch fonksiyonuna geçirilen args dizisi, Chromium’a komut satırı argümanları eklemenizi sağlar. Bu, tarayıcının davranışını ince ayarlamak için kullanışlıdır. page.setUserAgent ile tarayıcının kendini tanıtma şeklini değiştirebilirsiniz. page.setRequestInterception ile ağ isteklerini izleyebilir ve hatta engelleyebilir veya değiştirebilirsiniz. Bu, özellikle performansı artırmak (gereksiz kaynakları yüklemeyerek) veya belirli türdeki içerikleri filtrelemek için çok güçlü bir özelliktir.
Puppeteer’ı Etkin Kullanmak İçin İpuçları ve En İyi Uygulamalar
Puppeteer ile karmaşık otomasyon görevlerini başarıyla tamamlamak için bazı ipuçları ve en iyi uygulamaları göz önünde bulundurmak önemlidir.
Hata Yönetimi
Otomasyon betikleri, beklenmeyen durumlarla (ağ hataları, elementlerin bulunamaması, zaman aşımları) karşılaşabilir. Sağlam bir hata yönetimi, betiklerinizin daha güvenilir olmasını sağlar.
try {
// Puppeteer işlemleri
await page.goto('https://example.com/non-existent-page');
} catch (error) {
console.error('Bir hata oluştu:', error.message);
// Hata durumunda ekran görüntüsü al, log kaydı tut vb.
await page.screenshot({ path: 'error_screenshot.png' });
}
try-catch blokları, olası hataları yakalamak ve uygun şekilde işlemek için esastır. Hata durumunda ekran görüntüsü almak, sorunu ayıklamak için çok değerli bir ipucudur.
Bekleme Stratejileri
Web sayfaları asenkron yüklenir ve içeriğin ne zaman hazır olacağını tahmin etmek zor olabilir. Puppeteer’ın bekleme fonksiyonlarını doğru kullanmak, betiklerinizin kararlılığını artırır.
page.waitForSelector(selector): Belirli bir DOM elementinin sayfada görünmesini bekler.page.waitForNavigation(options): Sayfa navigasyonunun tamamlanmasını bekler.waitUntilseçenekleriyle (örneğin,'load','domcontentloaded','networkidle0','networkidle2') daha spesifik bekleme koşulları belirlenebilir.networkidle0genellikle tüm ağ isteklerinin durmasını beklediği için en güveniliridir.page.waitForFunction(pageFunction, options, ...args): Sayfa bağlamında bir JavaScript fonksiyonununtruedöndürmesini bekler. Çok esnek bir bekleme yöntemidir.page.waitForTimeout(milliseconds): Belirli bir süre bekler. Genellikle kaçınılması gereken bir yöntemdir çünkü sayfanın yüklenme süresi değişebilir ve gereksiz gecikmelere yol açabilir. Sadece kesinlikle gerekli olduğunda kullanılmalıdır.
Kaynak Yönetimi
Her Puppeteer betiği, tarayıcı ve sayfa örneklerini düzgün bir şekilde kapatmalıdır. Aksi takdirde, bellekte gereksiz kaynaklar kalabilir ve sistem performansını olumsuz etkileyebilir.
const browser = await puppeteer.launch();
const page = await browser.newPage();
try {
// İşlemler
} finally {
await browser.close(); // Her zaman tarayıcıyı kapat
}
finally bloğu, işlemler başarıyla tamamlansa da hata oluşsa da tarayıcının kapatılmasını garanti eder.
Paralel Çalıştırma
Birden fazla URL’yi eş zamanlı olarak işlemek, otomasyon görevlerinin süresini önemli ölçüde azaltabilir. Puppeteer, birden fazla sayfa veya tarayıcı örneği üzerinde paralel çalışmayı destekler.
async function processUrls(urls) {
const browser = await puppeteer.launch();
const results = await Promise.all(urls.map(async (url) => {
const page = await browser.newPage();
await page.goto(url);
const title = await page.title();
await page.close(); // Her sayfa işlendikten sonra kapat
return { url, title };
}));
await browser.close();
return results;
}
// processUrls(['https://example.com', 'https://google.com']).then(console.log);
Promise.all kullanarak, her URL için ayrı bir sayfa oluşturulur ve eş zamanlı olarak işlenir. Her sayfa işlendikten sonra kapatılmalıdır.
Proxy Kullanımı
Web scraping yaparken veya belirli coğrafi kısıtlamaları aşarken, IP adresinizin engellenmemesi için proxy sunucuları kullanmak önemlidir.
const browser = await puppeteer.launch({
args: ['--proxy-server=http://your_proxy_ip:port']
});
Proxy sunucu kimlik doğrulaması gerektiriyorsa, page.authenticate() yöntemini kullanabilirsiniz.
CAPTCHA ve Bot Algılama Sistemlerinden Kaçınma
Birçok web sitesi, botları algılamak ve engellemek için gelişmiş sistemler kullanır. Puppeteer ile bu sistemleri atlatmak zor olabilir, ancak bazı stratejiler yardımcı olabilir:
headless: false: Tarayıcıyı başsız modda çalıştırmak yerine görsel arayüzle çalıştırmak, bazı bot algılama sistemlerini atlatmaya yardımcı olabilir, çünkü gerçek bir tarayıcı gibi davranır.page.setUserAgent(): Gerçek bir kullanıcının tarayıcı bilgilerini taklit edin.page.evaluateOnNewDocument(): Sayfa yüklenmeden önce tarayıcıda bazı JavaScript değişkenlerini (örneğin,navigator.webdriverözelliğiniundefinedolarak ayarlamak) değiştirebilirsiniz.puppeteer-extravepuppeteer-extra-plugin-stealth: Bu kütüphaneler, Puppeteer’ı daha “insan” gibi göstermek için çeşitli hileler uygular.- Gerçekçi Kullanıcı Davranışları: Rastgele gecikmeler eklemek, fare hareketlerini ve kaydırma işlemlerini simüle etmek, insan benzeri etkileşimler sağlamak.
Puppeteer ve Diğer Otomasyon Araçları
Web otomasyonu dünyasında Puppeteer tek seçenek değildir. Diğer popüler araçlarla karşılaştırmak, doğru aracı seçmenize yardımcı olabilir.
Selenium ile Karşılaştırma
Selenium, uzun yıllardır web otomasyonu ve test dünyasının lideridir. Çeşitli programlama dilleri (Java, Python, C#, Ruby, JavaScript vb.) için sürücüleri ve farklı tarayıcılar (Chrome, Firefox, Safari, Edge) için desteğiyle bilinir.
- Çoklu Dil ve Tarayıcı Desteği: Selenium’un en büyük avantajı, çoklu dil ve tarayıcı desteğidir. Puppeteer ise öncelikle Node.js ve Chromium tabanlı tarayıcılar için optimize edilmiştir.
- API Yaklaşımı: Selenium, WebDriver protokolü üzerinden tarayıcılarla iletişim kurarken, Puppeteer doğrudan Chrome DevTools Protokolü’nü kullanır. Bu, Puppeteer’a daha düşük seviyeli ve daha hızlı bir kontrol imkanı sunar, özellikle Chrome/Chromium için.
- Performans: Genellikle Puppeteer, Chromium ile doğrudan entegrasyonu sayesinde daha hızlı performans sunar.
- Kurulum ve Kullanım Kolaylığı: Puppeteer’ın kurulumu ve kullanımı genellikle daha basittir, çünkü Chromium’u otomatik olarak indirir ve yapılandırır. Selenium’da ise tarayıcı sürücülerini manuel olarak yönetmek gerekebilir.
- Kullanım Alanları: Puppeteer, daha çok web scraping, PDF/ekran görüntüsü oluşturma gibi görevler için tercih edilirken, Selenium daha geniş çaplı uçtan uca test otomasyon projelerinde kullanılır.
Playwright ile Karşılaştırma
Playwright, Microsoft tarafından geliştirilen ve Puppeteer’a benzer, ancak daha geniş tarayıcı desteği sunan yeni nesil bir web otomasyon kütüphanesidir. Node.js, Python, Java ve .NET dillerini destekler.
- Çoklu Tarayıcı Desteği: Playwright, tek bir API ile Chromium, Firefox ve WebKit (Safari’nin motoru) tarayıcılarını destekler. Bu, Puppeteer’ın ötesinde bir avantajdır.
- Otomatik Beklemeler: Playwright, elementlerin eylemler için hazır olmasını otomatik olarak bekleyerek, manuel
waitForSelectorveyawaitForNavigationçağrılarına olan ihtiyacı azaltır. Bu, test kodunu daha temiz ve daha az kırılgan hale getirir. - Paralel Çalıştırma ve Test Koşucusu: Playwright, yerleşik bir test koşucusu ile gelir ve testleri paralel olarak çalıştırma konusunda Puppeteer’dan daha entegre bir çözüm sunar.
- Video Kaydı ve İzleme: Playwright, otomasyon sırasında tarayıcı etkileşimlerinin video kaydını alabilir ve test hatalarını ayıklamak için kapsamlı izleme yetenekleri sunar.
Puppeteer hala güçlü ve geçerli bir araç olsa da, Playwright daha geniş tarayıcı desteği ve bazı gelişmiş özellikleriyle modern web otomasyonu için güçlü bir alternatif olarak öne çıkmaktadır.
Sıkça Sorulan Sorular (SSS)
Puppeteer sadece Chrome ile mi çalışır?
Puppeteer, esas olarak Chromium tabanlı tarayıcılarla çalışmak üzere tasarlanmıştır. Varsayılan olarak, Puppeteer paketi ile birlikte gelen Chromium sürümünü kullanır. Ancak, Puppeteer’ı Google Chrome’un yüklü bir sürümüne veya Microsoft Edge gibi diğer Chromium tabanlı tarayıcılara bağlamak da mümkündür. Firefox desteği deneysel aşamadaydı ancak şu anda Puppeteer’ın kendi içinde aktif olarak desteklenmemektedir; bunun yerine Playwright gibi araçlar çoklu tarayıcı desteği sunar.
Headless modun dezavantajları nelerdir?
Headless modun başlıca dezavantajı, görsel bir arayüz olmaması nedeniyle hata ayıklamanın daha zor olmasıdır. Bir betik beklediğiniz gibi çalışmadığında, neyin yanlış gittiğini görmek için tarayıcı penceresini izleyemezsiniz. Bu durumda, ekran görüntüleri almak, tarayıcı günlüklerini incelemek veya headless: false modunda çalışarak sorunu görsel olarak tespit etmek gerekebilir. Ayrıca, bazı web siteleri, başsız tarayıcıları algılayıp engelleyebilir.
Performansı nasıl optimize edebilirim?
Puppeteer betiklerinizin performansını artırmak için birkaç strateji vardır:
- Gereksiz Kaynakları Engelleme:
page.setRequestInterception(true)kullanarak resimler, CSS dosyaları veya fontlar gibi gereksiz kaynakların yüklenmesini engelleyebilirsiniz. Bu, sayfa yükleme süresini ve bant genişliği kullanımını azaltır. - Doğru Bekleme Stratejileri:
waitForTimeoutkullanmaktan kaçının. Bunun yerinewaitForSelector,waitForNavigation,waitForFunctiongibi daha spesifik bekleme yöntemlerini kullanın. - Önbelleği Devre Dışı Bırakma: Bazı durumlarda, tarayıcı önbelleğini devre dışı bırakmak (özellikle her zaman en yeni içeriği çekmek istiyorsanız) performansı artırabilir.
- Headless Modu Kullanma: Başsız mod, GUI yükünü ortadan kaldırdığı için her zaman daha hızlıdır.
- Tarayıcı Argümanları:
puppeteer.launchfonksiyonuna--no-sandbox,--disable-gpugibi argümanlar ekleyerek performansı artırabilirsiniz (ancak güvenlik etkilerini göz önünde bulundurun). - Paralel İşlem: Birden fazla sayfa veya tarayıcı örneğini eş zamanlı olarak çalıştırarak toplam işlem süresini azaltabilirsiniz.
Sonuç
Puppeteer, Node.js ekosistemindeki en güçlü ve esnek web otomasyon kütüphanelerinden biridir. Headless Chrome’un gücünü geliştiricilerin parmak uçlarına getirerek, web scraping’den uçtan uca testlere, PDF oluşturmaktan dinamik içerik manipülasyonuna kadar geniş bir yelpazede görevleri otomatikleştirmeyi mümkün kılar. Sağladığı düşük seviyeli kontrol ve DevTools Protokolü ile doğrudan iletişim yeteneği, Puppeteer’ı özellikle karmaşık ve performans odaklı otomasyon projeleri için ideal bir seçenek haline getirir.
Bu makalede ele alınan kurulum, temel ve gelişmiş kullanım senaryoları, hata yönetimi, bekleme stratejileri ve performans optimizasyonu ipuçları, Puppeteer’ı etkin bir şekilde kullanmanız için sağlam bir temel oluşturmaktadır. Her ne kadar Playwright gibi alternatifler daha geniş tarayıcı desteği sunsa da, Puppeteer’ın Chromium ile derin entegrasyonu, olgunluğu ve geniş topluluk desteği, onu birçok geliştirici için vazgeçilmez bir araç yapmaya devam etmektedir. Web otomasyonu dünyasında, Puppeteer ile Headless Chrome ikilisi, dijital iş akışlarınızı hızlandırmak ve tekrarlayan görevleri ortadan kaldırmak için sınırsız potansiyel sunar.