Headless Tarayıcılar + Proxy'ler: Puppeteer ve Playwright için Kapsamlı Kurulum Rehberi

Puppeteer ve Playwright'ı rotasyonla, çalkantılı eklentiler, cihaz emulation ve koncurrent scraping patternlerini konut proxylerini kullanarak yapılandırın.

Headless Tarayıcılar + Proxy'ler: Puppeteer ve Playwright için Kapsamlı Kurulum Rehberi

Why Headless Browsers Need Proxies

Headless tarayıcılar - görünür bir GUI olmadan çalışan tarayıcı örnekleri - JavaScript-heavy weblerini kazımak için önemlidir. Bununla birlikte, tek bir IP adresinden birden fazla başsız tarayıcı seansı çalıştırın belirgin bir otomasyon sinyalidir. Başsız tarayıcıları rotasyonla birleştirerek bunu binlerce konut IP'leri dağıtarak çözer.

Bu kılavuz, Puppeteer ve Playwright proxy konfigürasyonunu, çalma eklentilerini ve rotasyon stratejilerini kapsar. Tespit nasıl işlediğine dair arka plan için, algılamanın nasıl çalıştığını görün Anti-bot algılama sistemlerine kılavuzluk.

Puppeteer Proxy Build

Temel Kurulum

// Puppeteer: Basic proxy configuration
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=http://gate.proxyhat.com:8080',
    '--no-sandbox',
    '--disable-setuid-sandbox'
  ]
});
const page = await browser.newPage();
// Authenticate with the proxy
await page.authenticate({
  username: 'USERNAME',
  password: 'PASSWORD'
});
await page.goto('https://example.com', {
  waitUntil: 'networkidle2',
  timeout: 30000
});
const content = await page.content();
console.log(content.substring(0, 200));
await browser.close();

Courtyard5 ile Puppeteer

// Puppeteer: SOCKS5 proxy configuration
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=socks5://gate.proxyhat.com:1080'
  ]
});
const page = await browser.newPage();
await page.authenticate({
  username: 'USERNAME',
  password: 'PASSWORD'
});

Puppeteer Stealth Plugin

Varsayılan Puppeteer konfigürasyonu, anti-bot sistemlerinin tespit ettiği düzinelerce otomasyon işaretini ortaya koyuyor. The The The The The The The The puppeteer-extra-plugin-stealth Eklentiler bu işaretler otomatik olarak.

// Install: npm install puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
// Apply stealth plugin
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=http://gate.proxyhat.com:8080',
    '--disable-blink-features=AutomationControlled',
    '--window-size=1920,1080',
    '--disable-dev-shm-usage'
  ]
});
const page = await browser.newPage();
await page.authenticate({
  username: 'USERNAME',
  password: 'PASSWORD'
});
// Set realistic viewport
await page.setViewport({ width: 1920, height: 1080 });
// Set extra headers for consistency
await page.setExtraHTTPHeaders({
  'Accept-Language': 'en-US,en;q=0.9'
});
await page.goto('https://example.com');

Stealth eklentisi:

  • navigator.webdriver - gerçek yerine tanımlanmamış olarak ayarlayın
  • chrome.runtime - eksik Chrome-özel nesneler ekleyin
  • WebGL satıcı/renderer – gerçekçi GPU dizeleri
  • Plugin ve izin dizileri – gerçek Chrome
  • Dil ve platform tutarlılığı

Bu yamaların adresinin ne hakkında daha derin bir anlayış için makalemizi bakınız tarayıcı parmak izi.

Playwright Proxy Ayarları

Playwright, Puppeteer'den daha zarif proxy yapılandırmasını sağlar, per-context proxy'leri destekler ve yerleşik cihaz emulation.

Temel Kurulum

// Playwright: Basic proxy setup
const { chromium } = require('playwright');
const browser = await chromium.launch({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME',
    password: 'PASSWORD'
  }
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
const title = await page.title();
console.log(`Page title: ${title}`);
await browser.close();

Per-Context Proxy (Different IPs per Tab)

// Playwright: Different proxy per context
const { chromium } = require('playwright');
const browser = await chromium.launch();
// Context 1: US proxy session
const ctx1 = await browser.newContext({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME-country-us-session-abc1',
    password: 'PASSWORD'
  },
  locale: 'en-US',
  timezoneId: 'America/New_York'
});
// Context 2: UK proxy session
const ctx2 = await browser.newContext({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME-country-gb-session-abc2',
    password: 'PASSWORD'
  },
  locale: 'en-GB',
  timezoneId: 'Europe/London'
});
const page1 = await ctx1.newPage();
const page2 = await ctx2.newPage();
// Each page uses a different IP and locale
await page1.goto('https://example.com');
await page2.goto('https://example.com');

Proxy with Proxy

// Playwright: Realistic device emulation + proxy
const { chromium, devices } = require('playwright');
const browser = await chromium.launch({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME',
    password: 'PASSWORD'
  }
});
// Emulate a specific device with matching settings
const context = await browser.newContext({
  ...devices['Desktop Chrome'],
  locale: 'en-US',
  timezoneId: 'America/Chicago',
  geolocation: { latitude: 41.8781, longitude: -87.6298 },
  permissions: ['geolocation'],
  colorScheme: 'light'
});
const page = await context.newPage();
await page.goto('https://example.com');

Headless Browsers ile Proxy Rotation

Strateji 1: İstek başına Yeni Context

Her URL için yeni bir tarayıcı bağlamı oluşturun. Bu, istek başına taze bir IP ve temiz bir kurabiye verir.

// Playwright: Rotate proxy per request via new contexts
async function scrapeWithRotation(urls) {
  const browser = await chromium.launch();
  const results = [];
  for (const url of urls) {
    const sessionId = `sess-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
    const context = await browser.newContext({
      proxy: {
        server: 'http://gate.proxyhat.com:8080',
        username: `USERNAME-session-${sessionId}`,
        password: 'PASSWORD'
      }
    });
    const page = await context.newPage();
    try {
      await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
      const data = await page.evaluate(() => document.title);
      results.push({ url, data });
    } catch (error) {
      console.error(`Failed: ${url} — ${error.message}`);
    } finally {
      await context.close();
    }
    // Natural delay between requests
    await new Promise(r => setTimeout(r, 1000 + Math.random() * 2000));
  }
  await browser.close();
  return results;
}

Strateji 2: Multi-Page Flows için Sticky Sessions

Aynı IP'yi birden çok sayfada tutmanız gerektiğinde yapışkan seanslar kullanın (pagination, login flows).

// Playwright: Sticky session for multi-page scraping
async function scrapeWithStickySession(baseUrl, pageCount) {
  const sessionId = `sticky-${Date.now()}`;
  const browser = await chromium.launch({
    proxy: {
      server: 'http://gate.proxyhat.com:8080',
      username: `USERNAME-session-${sessionId}`,
      password: 'PASSWORD'
    }
  });
  const context = await browser.newContext();
  const page = await context.newPage();
  const results = [];
  for (let i = 1; i <= pageCount; i++) {
    await page.goto(`${baseUrl}?page=${i}`, { waitUntil: 'networkidle' });
    const items = await page.$$eval('.item', els =>
      els.map(el => el.textContent.trim())
    );
    results.push(...items);
    // Natural delay between pages
    await new Promise(r => setTimeout(r, 1500 + Math.random() * 1500));
  }
  await browser.close();
  return results;
}

Strateji 3: Pool ile avcılık

// Playwright: Concurrent scraping with proxy pool
async function concurrentScrape(urls, concurrency = 5) {
  const browser = await chromium.launch();
  const results = [];
  // Process URLs in batches
  for (let i = 0; i < urls.length; i += concurrency) {
    const batch = urls.slice(i, i + concurrency);
    const promises = batch.map(async (url) => {
      const sessionId = `conc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
      const context = await browser.newContext({
        proxy: {
          server: 'http://gate.proxyhat.com:8080',
          username: `USERNAME-session-${sessionId}`,
          password: 'PASSWORD'
        }
      });
      const page = await context.newPage();
      try {
        await page.goto(url, { timeout: 30000, waitUntil: 'domcontentloaded' });
        return { url, title: await page.title(), status: 'ok' };
      } catch (e) {
        return { url, error: e.message, status: 'error' };
      } finally {
        await context.close();
      }
    });
    const batchResults = await Promise.all(promises);
    results.push(...batchResults);
    // Delay between batches
    await new Promise(r => setTimeout(r, 2000));
  }
  await browser.close();
  return results;
}

Python ile Puppeteer (Pyppeteer Alternative)

Python geliştiricileri için, playwright Python için aynı yetenekleri daha temiz sözcülerle sağlar.

# Python: Playwright with proxy and stealth settings
# pip install playwright
# playwright install chromium
from playwright.async_api import async_playwright
import asyncio
async def scrape_with_proxy():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            proxy={
                "server": "http://gate.proxyhat.com:8080",
                "username": "USERNAME",
                "password": "PASSWORD"
            }
        )
        context = await browser.new_context(
            viewport={"width": 1920, "height": 1080},
            locale="en-US",
            timezone_id="America/New_York",
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        )
        page = await context.new_page()
        await page.goto("https://example.com")
        title = await page.title()
        print(f"Title: {title}")
        await browser.close()
asyncio.run(scrape_with_proxy())

Kaynak Optimizasyonu

Headless tarayıcılar önemli hafıza ve CPU tüketiyor. Üretim iş yükleri için optimize edin:

Gereksiz Kaynaklar

// Playwright: Block images, fonts, and CSS to save bandwidth
const context = await browser.newContext({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME',
    password: 'PASSWORD'
  }
});
const page = await context.newPage();
// Block non-essential resources
await page.route('**/*.{png,jpg,jpeg,gif,svg,webp,woff,woff2,ttf,css}', route =>
  route.abort()
);
// Block tracking and analytics
await page.route('**/{google-analytics,gtag,facebook}**', route =>
  route.abort()
);
await page.goto('https://example.com');

Memory Management

  • Kullanıldıktan sonra yakın bağlamlar: Her açık bağlam 50-150MB tüketiyor. Her zaman yapıldığında yakın bağlamlar.
  • Limit eşzamanlı bağlamlar: Mevcut RAM'a göre 3-10 bağlamı tutun.
  • Yeniden başlatma tarayıcı periyodik olarak: 100-200 bağlam döngüsünden sonra, hafıza sızıntılarını önlemek için tarayıcıyı yeniden başlatın.
  • Başsız kullanın: 'yeni' (Puppeteer): Yeni kafasız mod eskisinden daha az hafıza kullanır.

Common Issues

Proxy Authentication Başarısızlıkları

// Handle proxy auth errors gracefully
try {
  const response = await page.goto(url, { timeout: 30000 });
  if (response.status() === 407) {
    console.error('Proxy authentication failed — check credentials');
  }
} catch (error) {
  if (error.message.includes('net::ERR_PROXY_CONNECTION_FAILED')) {
    console.error('Proxy connection failed — check proxy server availability');
  }
}

Timeout

// Retry with exponential backoff
async function gotoWithRetry(page, url, maxRetries = 3) {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      return await page.goto(url, {
        waitUntil: 'domcontentloaded',
        timeout: 30000
      });
    } catch (error) {
      if (attempt === maxRetries) throw error;
      const delay = 1000 * Math.pow(2, attempt) + Math.random() * 1000;
      console.log(`Retry ${attempt}/${maxRetries} after ${delay}ms`);
      await new Promise(r => setTimeout(r, delay));
    }
  }
}

En İyi Uygulamalar Checklist

En İyi Uygulamalar Checklist
Uygulama UygulamasıPuppeteerPlaywright
Per-context proxyVia start args sadecePer-context proxy desteği
Stealth yamalarpuppeteer-extrayerleşik cihaz emulation
Kaynak bloke ediciSayfa.setRequestInterceptionSayfa.route
Multi-MessageKromyum sadeceKromium, Firefox, WebKit
Oturum izolasyonuOturumda Yeni tarayıcıOturumda Yeni bağlam
Çoğu hurda görevi için, Playwright, üstün proxy desteği nedeniyle Puppeteer üzerinde önerilen bir seçimdir (per-context), yerleşik cihaz emulation ve çok sayıda tarayıcı desteği. Onu bir araya getirin ProxyHat'ın konut temsilcileri En iyi sonuçlar için.

Dile özel proxy kurulumu için kafasız tarayıcılar olmadan, rehberlerimizi göz önünde bulundurun Python Python, HayırVe Go Go Go Go. Kapsamlı anti-deteksiyon stratejileri için, okuyun algılama kılavuzuHer zaman etik kazı uygulamaları takip edin ve saygı web sitesi erişim politikaları.

Sık Sorulan Sorular

Başlamaya hazır mısınız?

148+ ülkede 50M+ konut IP'sine AI destekli filtreleme ile erişin.

Fiyatlandırmayı GörüntüleKonut Proxy'leri
← Bloga Dön