Puppeteer’da Ban Yemeden Dönen Proxy’ler Nasıl Kurulur

Son güncelleme: August 11, 2026
Hand-drawn diagram of a Puppeteer-controlled browser rotating requests through multiple proxy nodes
AI Özeti
  • Puppeteer proxy rotasyonu için tarayıcıyı her proxy’de yeniden başlatma, gateway tarafından yönetilen rotasyon, izole tarayıcı havuzları ve browser sharding gibi pratik mimarileri karşılaştırın.
  • Proxy kimlik bilgilerinin nereye yerleştirileceğini, HTTPS CONNECT’in istek yolunu nasıl değiştirdiğini ve yalnızca sayfa düzeyindeki kimlik doğrulamanın neden tarayıcı başlatma veya tünel hatalarını tek başına çözmeyebileceğini öğrenin.
  • Sağlık farkındalıklı seçim, sınırlı yeniden denemeler, cooldown’lar, neden kodlu başarısızlıklar ve her hatadan sonra körlemesine rotasyon yerine oturum tutarlılığı ile yapı kurun.
  • 403, 407, 429, navigation timeout, DNS ve TLS hatalarını, rotasyonu değiştirmeden önce hatayı üreten katmanı belirleyerek giderin.
  • Gözlemlenebilirlik, gizli bilgi yönetimi, eşzamanlılık sınırları, kontrollü kapanış ve politika farkındalıklı fail-closed davranışı içeren bir üretim kontrol listesini uygulayın.

Puppeteer kullanırken sık karşılaşılan hata deseni şöyledir: ilk birkaç istek sorunsuz gider, ama sonrasında 403 ya da 429 hataları almaya, zaman aşımına uğramaya ya da doğrulama sayfasına yönlendirilmeye başlarsınız. Buna rağmen birçok rehber, proxy rotasyonunu sanki iki satırlık bir ayar değişikliğiymiş gibi anlatır.

Aslında o kadar basit değil. "--proxy-server bayrağını ekleyin" örneğiyle, gerçekten uzun süre dayanan bir sistem kurmak tamamen farklı şeyler. Bu rehber; tarayıcı başına tam rotasyon, kimlik doğrulama gerektiren gateway’ler, tarayıcı sharding veya harici yönlendiriciler, tutarlı tarayıcı profilleri, üretim seviyesinde hata yönetimi ve proxy yönetiminin kendisinden ne zaman tamamen vazgeçmeniz gerektiğine dair dürüst bir değerlendirmeyi bir arada ele alıyor.

Dönen Proxy Nedir ve Puppeteer Neden Buna İhtiyaç Duyar?

Proxy, Puppeteer örneğiniz ile istek gönderdiğiniz site arasına girer. Site, sizin bilgisayarınızı değil, proxy’nin outbound IP’sini görür. Dönen proxy, bu outbound IP’yi sürekli değiştirir. Bazen her istekte, bazen her oturumda değiştirerek, trafiğin tek bir istemcinin sunucuya art arda yüzlerce kez yüklendiği gibi görünmesini engeller.

Puppeteer’ın özellikle bu yönteme ihtiyaç duymasının nedeni açık: tek bir IP’den art arda yüzlerce istek gönderen headless Chrome, tam olarak anti-bot sistemlerinin yakalamak üzere tasarlandığı örüntüdür. Cloudflare’ın resmi dokümantasyonuna bakarsanız, birden fazla tespit katmanının aynı anda çalıştığını görürsünüz: kural tabanlı değerlendirme, JavaScript fingerprint kontrolleri, makine öğrenmesi modelleri ve davranışsal anomali tespiti. IP rotasyonu bu katmanlardan yalnızca birine dokunur. Sadece bir tanesine.

Bilmeniz gereken üç proxy türü var ve bunlar birbirinin yerine geçmez.

  • Datacenter proxy’ler — ucuz, hızlı ve hosting şirketlerinden gelir. ASN’leri (ağ blokları) açıkça veri merkezi olarak sınıflandırıldığı için sitelerin fark etmesi kolaydır.
  • Residential proxy’ler — gerçek tüketici ISP’leri üzerinden geçtiği için, gerçek bir ev interneti gibi görünür. Daha yavaş ve daha pahalıdır ama çok daha inandırıcıdır.
  • Mobile proxy’ler — operatör ağı IP’leridir. Genellikle en pahalısıdır, ama gerçek bir mobil ağ kimliğine ihtiyaç duyduğunuzda işinize yarar.

Residential çıkışlar, yalnızca ASN sınıflandırmasına bakıldığında datacenter çıkışlarından daha az şüpheli görünebilir, ama hiçbir kategori engellenmeye karşı bağışık değildir. Evrensel bir tespit oranı diye bir şey yoktur. Sonuç; hedef siteye, çıkışın itibarına, konumuna, oturum geçmişine, tarayıcı profiline ve istek desenine göre değişir.

İnsanların sık karıştırdığı bir başka ayrım daha var. Kendi yönettiğiniz sabit bir listeyi döndürmek (havuzu siz yönetirsiniz, bir sonraki IP’yi siz seçersiniz, arızaları da siz ele alırsınız) ile backconnect/gateway proxy (tek bir uç noktaya bağlanırsınız, sağlayıcı arka planda çıkış IP’lerini değiştirir) aynı şey değildir. İkisi de geçerli yaklaşımlardır, sadece karmaşıklığın nerede yaşandığı değişir.

Puppeteer’da Neden Dönen Proxy Kurulur? Yaygın Kullanım Senaryoları

Açıkçası, gerçekten ihtiyaç duyana kadar rotasyonu hiç kullanmayabilirsiniz. Ama tam da ihtiyaç duyduğunuz an, neredeyse acil bir durum gibi hissettirir.

Kullanım SenaryosuRotasyon Neden Önemli?
Ürün kataloglarında fiyat takibiTek IP’den gelen tekrarlanan katalog istekleri hız limiti ve itibar sinyalleri biriktirebilir
Lead zenginleştirme / iletişim verisi çıkarmaTek IP’den yapılan tekrarlanan profil ziyaretleri gezinme değil scraping gibi görünür ve davranış motorları tarafından işaretlenebilir
SERP scrapingArama motorları IP tabanlı hız kısıtlama ve CAPTCHA engelleme konusunda en agresif sistemler arasındadır
Rakip istihbaratıAynı alan adını günler boyunca tekrar tekrar scrape etmek, IP’niz ve çerez geçmişinizle ilişkilenen bir parmak izi oluşturur
İçerik toplamaYüksek sayfa hacmi, sayfa başına düşük değer — bot tespitinin özellikle yakalamaya ayarlı olduğu trafik tipi budur

"Amazon 51. istekte engelliyor" gibi güvenip kullanabileceğiniz sabit bir sayı yoktur. Siteler global eşiklerini yayınlamaz ve kontrol yöntemleri de uç noktaya, hesap durumuna, ASN itibarına ve trafik desenine göre değişebilir. Bu yüzden en düşük istek hızıyla başlayın, yalnızca durum koduna değil gerçek içeriğe de bakın. Rotasyonu yalnızca ölçtüğünüz davranış ve hedef sitenin politikası gerçekten gerektirdiğinde ekleyin.

Puppeteer’da Üç Proxy Rotasyon Stratejisi: Hangisine İhtiyacınız Var?

Üç Puppeteer proxy stratejisinin karşılaştırması: tarayıcı yeniden başlatma, dönen gateway ve tarayıcı parçalama

Çoğu eğitim burada işi kısa geçer, ya da daha kötüsü, yalnızca en kaba yöntemi gösterir. Gerçekte üç farklı seviye vardır ve yanlış seçim yaparsanız ya zaman kaybedersiniz ya da tam tersine çok basit bir sorunu gereksiz yere karmaşıklaştırırsınız.

Rotasyon StratejisiAyrıntı SeviyesiTarayıcı Yeniden Başlatma Gerekir mi?KarmaşıklıkEn Uygun Olduğu Durum
Tarayıcı başına (--proxy-server)Tarayıcı örneği başına 1 proxyEvetDüşükBasit, düşük hacimli scraping
Gateway yönetimli (proxy-chain + backconnect uç noktası)Sağlayıcı/oturum politikasıHayırOrtaKimlik doğrulamalı dönen gateway’ler
Tarayıcı parçalama veya harici aktarıcıHer tarayıcı parçası ya da aktarıcı kuralı başına 1 proxyTek işlem içinde doğrudan değişim yokYüksekKontrollü eşzamanlılık ve ince ayrıntılı yönlendirme

Seçim yapmadan önce belirtilmesi gereken bir nokta var. Puppeteer’ın network interception dokümantasyonu, setRequestInterception ile istek başına temiz bir şekilde proxy değiştirmenin mümkün olmadığını açıkça belirtir. Interception edilen her istek, siz açıkça devam ettirene, bir yanıt verene veya iptal edene kadar askıda kalır. Gerçek istek bazlı proxy routing genellikle interception handler’ın içinde doğrudan iletimi değiştirmek yerine, isteği yerel, programlanabilir bir gateway (örneğin proxy-chain) üzerinden geçirmek şeklinde yapılır. Aşağıdaki Method 3’e geçmeden önce bunu aklınızda tutun.

Puppeteer’da Dönen Proxy Nasıl Kurulur: Adım Adım Kılavuz

Zorluk: Orta Süre: Üç yöntemin tamamı için yaklaşık 30-45 dakika Gerekenler: Node.js 18+, npm, proxy listesi veya sağlayıcı hesap formatı (protocol://user:pass@host:port) ve puppeteer, proxy-chain, puppeteer-extra paketleri

Ön Koşullar: Başlamadan Önce İhtiyacınız Olanlar

Temel paketleri kurun.

npm install puppeteer proxy-chain puppeteer-extra puppeteer-extra-plugin-stealth

Sağlayıcınızdan bir proxy listesi alın, ya da en azından gerçek istek hacmine geçmeden önce kodunuzu doğrulayacak birkaç test proxy’si hazırlayın. Gerçek bir üretim ortamı düşünüyorsanız residential proxy daha iyidir. Kimlik bilgilerini ortam değişkenlerinde saklayın, asla kodun içine gömmeyin. URL’nin içine koymaktan da kaçının ve loglara sızmasına izin vermeyin.

Yöntem 1: --proxy-server ile Tarayıcı Başına Proxy Rotasyonu

Bu yöntem herkesin ilk başladığı temel yaklaşımdır ve bunun iyi bir nedeni var: öngörülebilir olması. Puppeteer’ın LaunchOptions dokümantasyonu, Chrome komut satırı bayraklarını iletmek için args kullanımını desteklenen bir yöntem olarak açıklar ve --proxy-server Chromium’un yerleşik bir bayrağıdır.

import puppeteer from 'puppeteer';

const proxyPool = [
  'http://proxy1.example:8080',
  'http://proxy2.example:8080',
  'http://proxy3.example:8080',
];

let proxyIndex = 0;

async function scrapeWithRotation(url) {
  const proxy = proxyPool[proxyIndex % proxyPool.length];
  proxyIndex++;

  const browser = await puppeteer.launch({
    headless: true,
    args: [`--proxy-server=${proxy}`],
  });

  const page = await browser.newPage();

  // Proxy kimlik doğrulaması gerekiyorsa, bu adım herhangi bir yönlendirmeden önce çalışmalı
  await page.authenticate({
    username: process.env.PROXY_USER,
    password: process.env.PROXY_PASS,
  });

  await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30_000 });
  const content = await page.content();

  await browser.close(); // proxy değiştirmeden önce kapatın
  return content;
}

page.authenticate() fonksiyonunun Puppeteer içinde sessizce request interception’ı devreye soktuğunu da unutmayın — resmi dokümantasyona göre durum bu. Performans açısından büyük bir maliyeti yok, ama özellikle işler beklediğinizden yavaş gittiğinde bilmekte fayda var.

Beklenen sonuç: Her çağrıda farklı bir proxy’ye bağlı yeni bir tarayıcı açılır. Değiştirmek için tarayıcıyı kapatıp yeniden başlatmanız gerekir — bundan kaçış yok. 50 sayfa scrape etmeniz gerekiyorsa, yalnızca tarayıcı açma süresi bile bu yöntemi diğer iki yöntemden belirgin şekilde yavaş yapar.

Ne zaman kullanılır: Düşük eşzamanlılıklı scriptlerde, tek seferlik scrape işlerinde, hızdan çok debug kolaylığının önemli olduğu durumlarda.

Yöntem 2: proxy-chain ile Kimlik Doğrulamalı Dönen Gateway

Chrome, proxy URL’sinin içindeki user:pass@host biçimindeki kimlik bilgilerini doğrudan kabul etmez. proxy-chain paketi (Apify tarafından yönetilir), kimlik doğrulama gerektiren upstream’e giden anonim bir yerel proxy başlatarak bu sorunu çözer. Upstream, sağlayıcının dönen ya da backconnect gateway’iyse, sağlayıcının oturum politikasına göre o tek uç noktanın arkasındaki outbound IP değişir. proxy-chain’in kendisi zaten açık olan bir Puppeteer page’ine başka bir proxy’yi zorla enjekte edemez.

import puppeteer from 'puppeteer';
import { anonymizeProxy, closeAnonymizedProxy } from 'proxy-chain';

async function scrapeThroughGateway(upstreamProxyUrl, targetUrl) {
  const localProxy = await anonymizeProxy(upstreamProxyUrl);
  let browser;

  try {
    browser = await puppeteer.launch({
      headless: true,
      args: [`--proxy-server=${localProxy}`],
    });
    const page = await browser.newPage();
    await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
    return await page.content();
  } finally {
    if (browser) await browser.close();
    await closeAnonymizedProxy(localProxy, true); // her zaman temizleyin
  }
}

Bu finally bloğu süs değil. Temizlenmeyen yerel proxy sunucuları port sızıntısına yol açar, ve anonimleştirilmiş proxy’yi kapatmamak, scraper’ın gece boyunca sessizce file descriptor tüketmesi gibi gerçek bir soruna da yol açabilir. proxy-chain, hata sınıflandırması için özellikle kullanışlı kodlar da sunar: DNS sorunları için 593, bağlantı reddi için 594, kimlik doğrulama hatası için 597. Bu konuya birazdan geri döneceğiz.

Ne zaman kullanılır: Rotasyonun sağlayıcı uç noktası veya oturum parametreleri tarafından kontrol edildiği, kimlik doğrulamalı residential/datacenter gateway’lerde. Aynı anda birden fazla sabit proxy kimliği kullanmanız gerekiyorsa, browser sharding’i ya da bu amaca uygun tasarlanmış harici bir yönlendirici kullanın. Yerel Puppeteer, page bazında proxy ayarını varsayılan olarak desteklemez.

Yöntem 3: İstek Bazlı Yönlendirme İçin Harici Bir Aktarıcı Gerekir

Bu en ince ayrıntılı seçenektir. Teoride, sayfa içindeki her görsel, script ve API çağrısı için farklı bir outbound kullanabilirsiniz. Ama gerçekte Puppeteer’ın request interception’ı, isteğe göre ağ iletimini değiştirmek için değil, istekleri filtrelemek ve ele almak için tasarlanmıştır — bu yüzden en kırılgan ve en az belgelenmiş yaklaşımdır.

import puppeteer from 'puppeteer';

async function inspectRequests(url) {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();

  await page.setRequestInterception(true);

  page.on('request', async (request) => {
    // Pratikte gerçek istek bazlı proxy değişimi, tarayıcının taşımasını
    // uçuş sırasında değiştirmek yerine yerel bir aktarıcı (proxy-chain)
    // üzerinden yönlendirme gerektirir — Chrome bunu desteklemez.
    // Üretim kurulumlarının çoğu bu handler’ı kaynak türlerini filtrelemek/
    // iptal etmek için kullanır ve bunu tarayıcı parçalama veya gateway ile eşleştirir.
    if (['image', 'font', 'stylesheet'].includes(request.resourceType())) {
      request.abort();
    } else {
      request.continue();
    }
  });

  await page.goto(url, { waitUntil: 'networkidle2' });
  await browser.close();
}

Dürüst değerlendirme: Puppeteer içinde istek başına IP değiştirmek setRequestInterception() ile çözülmez. Gerçekten bu seviyede ayrıntılı kontrole ihtiyacınız varsa, Chrome’u programlanabilir harici bir yönlendiricinin arkasına koyun ya da proxy session’ı merkeze alan bir scraping framework kullanın. Çoğu projede, browser shard başına bir proxy ya da sağlayıcı tarafından yönetilen dönen bir gateway, işletmesi ve izlemesi çok daha kolaydır.

Tam Anti-Tespit Yığını: Sadece Dönen Proxy’ler Yasaklanmanızı Önlemez

En yaygın şikayet şu: "Proxy kullanmama rağmen sürekli engelleniyorum." Ama IP adresi, modern bot sistemlerinin görebildiği sinyallerden yalnızca biri. Diğer tüm sinyaller aynı kalırken sadece IP’yi değiştirmek, aslında daha büyük bir anomaliye yol açabilir. Windows Chrome’muş gibi davranırken client hints, saat dilimi ve yerel ayarları tamamen farklı olan bir tarayıcı, bunun tipik bir örneğidir.

Katman 1: Dönen Residential Proxy’ler

Daha önce açıklandığı gibi, residential çıkışlar genellikle datacenter çıkışlarından daha güvenilir görünür. Ama minimum pool size gibi evrensel bir kriter yok. Pool size’ı rastgele bir IP sayısına göre değil, gerçek istek hacmine, oturum süresine, bekleme süresine ve sağlayıcının yeniden kullanım desenine göre belirleyin.

Katman 2: Headless Chrome Sinyallerini Gizlemek İçin Stealth Eklentisi

puppeteer-extra-plugin-stealth, bilinen bazı headless izlerini yamar. Örneğin navigator.webdriver, WebGL vendor string’i, eksik Chrome runtime nesneleri ve birkaç CDP sızıntısı gibi noktaları ele alır. Gerçekten oldukça kullanışlı bir uyumluluk katmanı. Ama projenin README’sinin de açıkça belirttiği gibi, bu bir kedi-fare oyunu ve tam koruma muhtemelen mümkün değil. Bunu bir garanti değil, temel bir savunma seviyesi olarak görün.

Katman 3: Tutarlı Tarayıcı Profilleri ve Ölçülü İstek Hızı

User-agent string’i, tarayıcının bildirdiği diğer tüm değerlerle içsel olarak tutarlı olmalıdır. Chrome’un User-Agent Client Hints özelliği yapılandırılmış platform verisi sağladığından, elle yazılmış bir user-agent string’i gerçek platformla çelişebilir. Paketlenmiş Chrome sürümünün verdiği user-agent’ı kullanın, oturum içinde viewport/locale/timezone değerlerini sabit tutun ve her sayfada yeni bir fingerprint uydurmaya çalışmak yerine istek hızını dikkatle ayarlayın.

Aşağıda bu üç katmanı tek bir başlangıç kurulumunda birleştiren bir örnek var.

import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import { anonymizeProxy, closeAnonymizedProxy } from 'proxy-chain';

puppeteer.use(StealthPlugin());

function boundedDelay(minMs = 800, maxMs = 1800) {
  return new Promise((r) => setTimeout(r, minMs + Math.random() * (maxMs - minMs)));
}

async function stableProfileScrape(targetUrl, upstreamProxy) {
  const localProxy = await anonymizeProxy(upstreamProxy);
  let browser;

  try {
    browser = await puppeteer.launch({
      headless: true,
      args: [`--proxy-server=${localProxy}`, '--lang=en-US'],
    });
    const page = await browser.newPage();
    await page.setViewport({ width: 1366, height: 768 });
    await boundedDelay();
    await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
    return await page.content();
  } finally {
    if (browser) await browser.close();
    await closeAnonymizedProxy(localProxy, true);
  }
}

Bu, diğer rehberlerin neredeyse hiç göstermediği bir kısım. Proxy, stealth ve fingerprint randomization’ı tek seferde bir araya getiren, doğrudan kullanabileceğiniz bir örnek.

Üretime Hazır Hata Yönetimi ve Proxy Sağlık Kontrolleri

403, 407, 429, timeout, cooldown ve quarantine yönetimi için proxy havuzu sağlık durum makinesi

Çoğu eğitim happy path’te sona erer. Gerçek scraping ise sürekli başarısız olur: proxy’ler ölür, kimlik bilgilerinin süresi dolar, hedef site çalışma sırasında hız sınırı koyar. Bu, sadece umut ederek çözülecek bir şey değil.

Üstel Geri Çekilme ve Jitter ile Yeniden Deneme Mantığı

function backoffMs(attempt, base = 1000, cap = 30_000) {
  const exponential = Math.min(cap, base * 2 ** attempt);
  return Math.floor(exponential * (0.5 + Math.random() * 0.5)); // jitter, senkron saldırıyı önler
}

async function withRetry(fn, maxRetries = 4) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      return await fn();
    } catch (err) {
      if (attempt === maxRetries) throw err;
      const delay = backoffMs(attempt);
      console.warn(`Deneme ${attempt + 1} başarısız oldu: ${err.message}. ${delay}ms sonra yeniden deneniyor`);
      await new Promise((r) => setTimeout(r, delay));
    }
  }
}

Başarısız Proxy’leri Otomatik Kara Listeye Alma

const proxyStats = new Map(); // proxyUrl -> { success, failure }

function recordResult(proxyUrl, success) {
  const stats = proxyStats.get(proxyUrl) || { success: 0, failure: 0 };
  success ? stats.success++ : stats.failure++;
  proxyStats.set(proxyUrl, stats);
}

function isHealthy(proxyUrl) {
  const stats = proxyStats.get(proxyUrl);
  if (!stats) return true;
  const total = stats.success + stats.failure;
  if (total < 5) return true; // henüz yeterli veri yok
  return stats.failure / total < 0.5; // hata oranı %50’yi aşarsa kara liste
}

function getHealthyProxy(pool) {
  const healthy = pool.filter(isHealthy);
  if (healthy.length === 0) throw new Error('Havuzda sağlıklı proxy kalmadı');
  return healthy[Math.floor(Math.random() * healthy.length)];
}

Yalnızca başarı/başarısızlığa değil, hata türüne de bakın. 407 (yanlış kimlik bilgileri) ile 429 (hız sınırı) tamamen farklı tepkiler gerektirir. Kimlik doğrulaması başarısız olan bir proxy’yi hızlıca tekrar denemek sadece zaman kaybıdır. Çözüm daha hızlı bir rotasyon değil, kimlik bilgilerini kontrol etmektir.

Puppeteer’da Yaygın Dönen Proxy Hatalarını Giderme

HataMuhtemel NedenÇözüm
ERR_PROXY_CONNECTION_FAILEDProxy kapalı veya erişilemezHavuzdan çıkarın, bir sonraki proxy ile yeniden deneyin
407 Proxy Authentication RequiredYanlış kimlik bilgileri veya desteklenmeyen kimlik doğrulamapage.authenticate() bilgilerini doğrulayın; URL içine gömülü auth için proxy-chain kullanın
TimeoutErrorYavaş proxy veya hedefin engellemesiTimeout’u artırın; residential proxy’ye geçin
403 ForbiddenIP veya parmak izi işaretlenmişProxy değiştirin + stealth etkinleştirin + user-agent’ı rastgeleleştirin
ERR_TUNNEL_CONNECTION_FAILEDHTTPS tünel sorunuCONNECT yöntem desteğini kontrol edin; proxy-chain ile yerel tünellemeyi deneyin

Tabloya tam oturmayan önemli bir nokta daha var: 200 durum kodu başarı anlamına gelmez. Soft block’lar genellikle normal bir durum koduyla birlikte, tamamen render edilmiş bir HTML sayfası da döndürebilir — login duvarları ya da challenge ekranları buna örnek. Bu yüzden yalnızca yanıt koduna değil, gerçek içeriğe de bakmanız gerekir. Takıldığınızda, Puppeteer’ın debug rehberi headless: false ile çalıştırmanızı, slowMo eklemenizi ve ayrıntılı protokol logları için NODE_DEBUG="puppeteer:*" ayarlamanızı önerir. Ama bu loglar hassas istek verisi içerebileceğinden, üretim kimlik bilgileriyle çalıştırırken açıkta bırakmayın.

Kendi Yönettiğiniz Proxy Rotasyonu vs. Proxy Gateway vs. AI Extract API

KriterKendi Yönettiğiniz Liste RotasyonuBackconnect Gateway (Bright Data, Oxylabs, Decodo)AI Extraction API (Thunderbit)
Maliyet (düşük hacim)Düşük–OrtaGB başına Orta–YüksekDüşük (ücretsiz plan, sonra birim bazlı)
GüvenilirlikSağlık kontrollerinize bağlıYüksek (sağlayıcı yönetimli)Yüksek (yönetilen altyapı)
Anti-tespitKendiniz kurarsınızKısmi (yalnızca IP rotasyonu)Yerleşik
Yapılandırılmış çıktıHayır (ham HTML)Hayır (ham HTML)Evet (şemaya göre JSON)
Kurulum süresiSaatlerDakikalarDakikalar
KontrolTamSağlayıcının API’siyle sınırlıŞema modeliyle sınırlı

2026-08-07 itibarıyla kontrol edilen güncel vendor fiyatları, gateway seçeneklerinin maliyet eğrisini gösteriyor. Bright Data’nın residential fiyatlandırması, promosyonlara göre değişebilen kullanım bazlı ücretlendirme ve kapasite planları sunuyor. Oxylabs, 5 GB’de GB başına 6 dolar, 1 TB’de GB başına 2,50 dolar öneriyor. Decodo (eski adıyla Smartproxy), 3 GB’de GB başına 3,75 dolar, 100 GB’de GB başına 2,75 dolar ve kullanım bazlı ücretlendirmede GB başına 4 dolar sunuyor. Decodo ayrıca 115M+ IP havuzu ve %99,92 başarı oranı iddiasında bulunuyor — ancak bu yalnızca vendor’ın kendi iddiası, bağımsız olarak tekrarlanmış bir benchmark değil.

Gerçekte kullandığım karar kriteri şu: Sayfayla etkileşime girmeniz mi gerekiyor? Tıklama, kaydırma, form doldurma, oturum durumunu koruma gerekiyor mu? O zaman Puppeteer ve proxy kullanırım. Yalnızca sayfada zaten bulunan veriyi mi almanız gerekiyor? O zaman proxy altyapısı kurmadan önce extraction API’ye bakarım.

Puppeteer + Proxy Ne Zaman Gereğinden Fazla: Bunun Yerine API ile Yapılandırılmış Veri Çekin

Bir projede, tek yapmam gereken ürün fiyatlarını bir spreadsheet’e taşımakken üçüncü kez proxy health check sistemini yeniden yazarken bunu fark ettim. Bu altyapının çoğu, aslında geliştiricinin asıl hedefi olmayan bir sorunu çözmek için var: sayfadan ham HTML almak. Gerçek hedef structured data’dır. HTML sadece can sıkıcı bir ara biçim.

Thunderbit’in Open API’si, extraction’ı tarayıcı otomasyonunun bir yan ürünü değil, asıl iş olarak ele alır. POST /extract, bir URL ve JSON Schema alır, buna uygun structured data döndürür. JS render etme, anti-bot önlemleri ve CAPTCHA’lar arka planda halledilir, yani kullanıcının stealth eklentileriyle ya da proxy pool’larıyla doğrudan uğraşmasına gerek kalmaz.

curl -X POST https://openapi.thunderbit.com/openapi/v1/extract \
  -H "Authorization: Bearer $THUNDERBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product",
    "schema": {
      "type": "object",
      "properties": {
        "name": {"type": "string"},
        "price": {"type": "number"}
      },
      "required": ["name", "price"]
    }
  }'

Ayrıca, katı bir schema yerine yalnızca temiz Markdown’a ihtiyaç duyduğunuzda kullanılan bir POST /distill endpoint’i de var, ve aynı schema’yı birden fazla URL’e tek seferde uygulayan batch extraction da destekleniyor. Thunderbit’in güncel API fiyatlandırmasına göre Distill sayfa başına 1 unit, Extract sayfa başına 20 unit kullanıyor. Ücretsiz planda 600 tek seferlik unit bulunuyor, bu da bir iş akışına bağlanmadan önce denemek için yeterli.

Claude, Cursor veya MCP uyumlu bir istemci içinde çalışan geliştiriciler için Thunderbit, thunderbit_extract ve thunderbit_distill araçlarını MCP üzerinden de sunuyor. Böylece bir agent, iş akışının ortasında ayrı bir scraping adımına gerek kalmadan sayfadan veri almaya karar verebilir. MCP yapılandırmasını eklemeden önce gerçek API reference’ını kontrol etmenizi öneririm, çünkü araç isimleri ve parametreler dokümantasyon sürümlerine göre değişebilir.

BoyutPuppeteer + Dönen Proxy’lerThunderbit API
Kurulum karmaşıklığıYüksek — proxy havuzu, rotasyon mantığı, stealth, yeniden denemeDüşük — JSON Schema ile tek API çağrısı
Anti-bot yönetimiManuelYerleşik
ÇıktıHam HTML (ayrıştırma gerekir)Şemanıza uyan yapılandırılmış JSON
BakımYüksek — selector’lar bozulur, proxy’ler yıpranırDüşük
En iyi kullanımÖzel otomasyon, giriş akışları, niş etkileşimlerÖlçekli veri çıkarma

DIY yaklaşımın da elbette avantajları var. Kullanım senaryonuz hesap girişi, birden fazla adımı tıklayarak ilerlemek veya oturum durumunu korumak gerektiriyorsa, extraction API’nin yerini tutması genellikle zordur. Thunderbit’in SSS’i de interaktif login akışlarının şu an API tarafından desteklenmediğini açıkça belirtiyor. Bu durumlarda hâlâ Puppeteer + proxy doğru seçim. Ama işiniz "birden fazla herkese açık sayfadan kendi schema’ma uyan veriyi almak" ise, kendi proxy rotasyon yığınınızı sıfırdan kurmak, aslında olduğundan daha büyük bir problemi çözmeye çalışmak olabilir. Daha az kod yazmak isteyen ekipler için, Thunderbit Chrome Eklentisi aynı AI tabanlı extraction’ı tıklama tabanlı bir arayüzle sunuyor. Kodsuz web scraping ile tam geliştirici düzeyinde bir kurulum arasında karar veremiyorsanız, göz atmaya değer.

Sonuç ve Temel Çıkarımlar

Puppeteer’da dönen proxy tek bir teknik anlamına gelmez. Tarayıcı başına rotasyon basit ve izoledir. Kimlik doğrulaması gereken backconnect gateway, tek bir tarayıcı-ortak uç noktanın arkasında çıkışları döndürür. Daha ince ayrıntılı istek bazlı kontrol veya eşzamanlılık yönetimi istiyorsanız browser sharding veya harici bir yönlendirici gerekir; yalnızca request interception ile Chrome’un ağ yolunu değiştiremezsiniz.

Ama diğer katmanlar desteklemedikçe bunların hiçbiri fazla bir anlam ifade etmez. Proxy, IP itibarı problemini çözer; stealth plugin ve fingerprint tutarlılığı, browser signal problemini çözer; jitter ve hızı ayarlanmış istekler ise davranış deseni problemini çözer. Bunlardan biri bile eksik olursa yine de engellenebilirsiniz — sadece bu sefer nedeni farklı olur.

Kendi başınıza kuracaksanız proxy-chain deposundan ve yukarıdaki kod bloklarından başlayın — bu sizi çoğu ücretli kurstan çok daha ileriye taşır. Proxy yönetimini tamamen atlayıp yalnızca structured data almak istiyorsanız, bütün hafta sonunuzu bitmek bilmeyen bir health check altyapısı kurmaya harcamadan önce Thunderbit API dokümantasyonuna 10 dakika ayırmak buna değer. İki yaklaşım da geçerli. Önemli olan, bir eğitimin varsaydığı sorunu değil, gerçekten sizin sahip olduğunuz sorunu çözmek. Bu alanın AI ile nasıl değiştiğine daha geniş açıdan bakmak isterseniz, AI web scraping ile geleneksel yaklaşımları karşılaştıran derinlemesine yazıya da göz atabilirsiniz.

SSS

Puppeteer’da proxy’leri ne sıklıkla döndürmeliyim?

Bu, hedef sitenin rate limit’inin ne kadar agresif olduğuna bağlıdır. Bot tespiti sıkı bir siteyse, sayfa bazında ya da oturum bazında değiştirin. Daha esnek bir siteyse, tüm scrape boyunca aynı IP’yi bir oturumda sabit tutmak da sorun olmayabilir. Evrensel bir sayı yoktur. 403, 429 ve timeout’ları sabit bir istek sayısı olarak değil, daha agresif bir rotasyona ihtiyaç duyduğunuzun sinyali olarak görün.

Puppeteer scraping için ücretsiz proxy kullanabilir miyim?

Teknik olarak mümkün, ama hızlı bir testin ötesine geçtiğinizde önermiyorum. Ücretsiz proxy listeleri genellikle yavaş, güvenilmez ve çoğu zaman zaten scrape etmeye çalıştığınız sitede engellenmiş durumda. Üretim için bir işse, ücretli bir sağlayıcının residential proxy’sine ya da yönetilen bir gateway’e para ödemek buna değer.

puppeteer-extra-plugin-stealth tüm anti-bot sistemlerine karşı işe yarar mı?

Hayır. Eklentinin kendi dokümantasyonu da bunu söylüyor. Bazı yaygın headless Chrome sinyallerini azaltır, ama hedef site yine de ağ itibarını, TLS özelliklerini, çerezleri, client hints’i ve davranış desenlerini değerlendirebilir. Bu eklenti bir garanti değil, bir uyumluluk katmanıdır.

Puppeteer’da proxy-chain ile --proxy-server arasındaki fark nedir?

--proxy-server, tek bir proxy uç noktasını tüm tarayıcı örneğine bağlayan bir Chromium başlangıç bayrağıdır. Chrome bu noktada yerleşik proxy kimlik bilgilerini kabul etmez. proxy-chain, kimlik doğrulama gerektiren bir upstream’e giden yerel, anonim bir tünel oluşturur. Rotasyonu sağlamanın yolu farklı bir upstream ile yeniden başlatmak, sağlayıcı tarafından yönetilen bir backconnect gateway kullanmak ya da bu amaç için tasarlanmış ayrı bir yönlendirici kullanmaktır — proxy-chain’in Puppeteer’ın her page’ine ayrı ayrı proxy takması şeklinde değil.

Tamamen engellenmemek için dönen proxy’ler yeterli mi?

Hayır. Ve bu en yaygın yanlış anlama. Cloudflare’ın bot management gibi modern anti-bot sistemleri yalnızca IP itibarına değil, browser fingerprint’ine, davranış desenlerine ve oturum geçmişine de bakar. Proxy yalnızca IP itibarı kısmını çözer. Diğer sinyallerde takılmamak için stealth yapılandırması, tutarlı bir fingerprint ve gerçekçi bir zamanlama da gereklidir.

Daha Fazla Bilgi

Ke
Ke
Thunderbit’ta CTO | Kıdemli Veri Bilimci ve ML Uzmanı Makine öğrenimi ve veri bilimi alanında yaklaşık on yıllık deneyime sahip olan Ke Shen, Columbia University mezunu ve Walmart Labs’te eski Kıdemli Veri Bilimci’dir. Python, R, Java ve İstatistik konularında derin ve meslektaşları tarafından tanınan uzmanlığıyla, karmaşık yapay zekâ algoritmalarını teoriden üretim düzeyinde mimariye taşıma konusunda sahada test edilmiş içgörüler paylaşır.
Topics
Puppeteer proxy rotasyonuProxy rotasyonuTarayıcı otomasyonu
İçindekiler
Thunderbit · AI web veri ajanı

Herhangi bir sayfadan veriyi 1 tık içinde çıkar

250.000+ kullanıcı tarafından güveniliyor
ücretsiz plan mevcut
Web sayfasından tabloya
Ne istediğini anlat — Thunderbit'in AI Agent'ı bunu kazır ve Excel, Google Sheets, Airtable veya Notion'a aktarır. Başlamak ücretsiz.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week