Bloga geri dön

Playwright'te headless test ve veri kazıma için proxy ayarları: kapsamlı rehber

Playwright'te headless testler ve veri çekimi için proxy'yi doğru şekilde nasıl bağlayacağımızı inceliyoruz - kod örnekleri, IP rotasyonu ve bot koruma sistemlerini aşma ile.

📅8 Mayıs 2026

Playwright, tarayıcı otomasyonu, headless test ve veri çekimi için en güçlü araçlardan biridir. Ancak doğru şekilde ayarlanmamış bir proxy olmadan, scriptiniz hızla IP banı alır: siteler otomatikleştirilmiş istekleri tanımayı öğrendi ve bunları engellemeye başladı. Bu rehberde, Playwright'te proxy bağlama yöntemlerini inceleyeceğiz — temel yapılandırmadan IP döngüsüne ve Cloudflare engelinin aşılmasına kadar.

Playwright'te proxy neden gereklidir ve ne zaman kaçınılmazdır

Playwright, arka planda gerçek bir tarayıcı (Chromium, Firefox veya WebKit) çalıştırır — bu da headless'tir. Site açısından, normal bir kullanıcı gibi görünüyorsunuz, ancak bu sadece belirli bir noktaya kadar geçerlidir. Bir IP'den saatte yüzlerce istek gelmeye başladığında, koruma algoritmaları anında tepki verir: CAPTCHA, geçici engelleme, tam ban.

İşte proxy'nin zorunlu olduğu belirli senaryolar:

  • Pazar yerlerinin veri çekimi — Wildberries, Ozon, Avito, Yandex.Market, bir IP'den 50-100 istekten sonra scriptleri engelliyor.
  • Rakip fiyatlarının izlenmesi — her 15 dakikada bir kontrol yaparsanız, IP değişimi olmadan birkaç saat içinde ban alırsınız.
  • Coğrafi konum testi — sitenin Almanya, ABD veya Kazakistan'daki kullanıcılar için nasıl göründüğünü kontrol etmeniz gerekiyor.
  • Form doldurma ve hesap kaydı — platformlar hesapları IP'ye bağlar ve toplu kaydı engeller.
  • SEO izleme — Google ve Yandex'ten pozisyon toplamak sürekli IP değişimi gerektirir, aksi takdirde arama motoru CAPTCHA gösterir.
  • A/B fonksiyonlarının testi — bazı özellikler yalnızca belirli ülkelerden veya bölgelerden gelen kullanıcılara açıktır.

Önemli olan: Playwright, sizi anonim hale getirmez. Proxy olmadan tüm istekler gerçek IP adresinizden gelir. Proxy eklemek, herhangi bir otomatikleştirilmiş scriptin stabil çalışması için atılacak ilk ve en önemli adımdır.

💡 Bilmeniz gerekenler

Playwright, tüm tarayıcı düzeyinde, ayrı bir bağlam (BrowserContext) ve hatta ayrı bir sayfa düzeyinde proxy'yi destekler. Bu, esneklik sağlar: farklı sayfalar aynı anda farklı IP'ler üzerinden çalışabilir.

Headless otomasyon için hangi proxy türü seçilmeli

Tüm proxy'ler Playwright için eşit derecede uygun değildir. Seçim, görevinize bağlıdır: neyi çekiyorsunuz, sitenin koruma seviyesi ne kadar agresif ve ne kadar istek planlıyorsunuz.

Proxy Türü Güven Seviyesi Hız Uygun Olduğu Alanlar
Veri Merkezi Düşük Çok Yüksek Sıkı koruma olmayan veri çekimi, test
İkametgah Proxy'leri Yüksek Orta Cloudflare ile siteler, pazar yerleri, sosyal medya
Mobil Proxy'ler Maksimum Orta Facebook, TikTok, Instagram, sıkı anti-botlar
SOCKS5 Kaynağa bağlı Yüksek Evrensel protokol, Playwright tarafından desteklenir

Çoğu veri çekme görevi için en iyi seçim, döngü ile birlikte ikametgah proxy'leridir. Gerçek ev kullanıcılarının IP'lerine sahip oldukları için, siteler bunları veri merkezi olarak tanımlamaz ve otomatik olarak engellemez. Agresif korumaya sahip siteler (Cloudflare Bot Yönetimi, Akamai) için mobil proxy'ler kullanmak daha iyidir — bu IP'ler, mobil operatörlere aittir ve bu da maksimum güven sağlar.

Playwright, http, https ve socks5 protokollerini destekler. Önemli: SOCKS5, bazı sürümlerde doğrudan kullanıcı adı:şifre ile yetkilendirmeyi desteklemez — bu konuda hatalar bölümünde daha fazla bilgi bulabilirsiniz.

Playwright'te proxy'nin temel ayarı (JavaScript ve Python)

Playwright, tarayıcıyı başlatırken proxy parametresi ile proxy ayarlamanıza olanak tanır. Bu en basit yöntemdir — tarayıcının tüm istekleri belirtilen proxy sunucusu üzerinden gidecektir.

JavaScript / Node.js

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://proxy.example.com:8080'
    }
  });

  const page = await browser.newPage();
  await page.goto('https://httpbin.org/ip');
  
  const content = await page.textContent('body');
  console.log(content); // proxy sunucusunun IP'sini gösterir

  await browser.close();
})();

Python

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server": "http://proxy.example.com:8080"
        }
    )
    
    page = browser.new_page()
    page.goto("https://httpbin.org/ip")
    
    print(page.text_content("body"))  # proxy IP'sini gösterir
    
    browser.close()

SOCKS5 için, sunucu adresindeki şemayı değiştirin:

# Python — SOCKS5 proxy
browser = p.chromium.launch(
    proxy={
        "server": "socks5://proxy.example.com:1080"
    }
)

Proxy'nin çalıştığını hızlıca kontrol etmek için https://httpbin.org/ip veya https://api.ipify.org adresini açın — yanıt, gerçek IP'niz değil, proxy sunucusunun IP'si olmalıdır.

Kullanıcı adı ve şifre ile yetkilendirilmiş proxy

Çoğu ticari proxy sağlayıcısı, kullanıcı adı ve şifre ile yetkilendirme kullanır — bu standart bir uygulamadır. Playwright, proxy nesnesinde username ve password alanları aracılığıyla bunu destekler.

JavaScript

const browser = await chromium.launch({
  proxy: {
    server: 'http://gate.proxyprovider.com:7777',
    username: 'your_login',
    password: 'your_password'
  }
});

Python

browser = p.chromium.launch(
    proxy={
        "server": "http://gate.proxyprovider.com:7777",
        "username": "your_login",
        "password": "your_password"
    }
)

Ayrıca, kullanıcı adı ve şifreyi doğrudan proxy sunucusunun URL'sine de iletebilirsiniz — bu, dinamik olarak bir dize oluşturduğunuzda kullanışlıdır:

# URL'de yetkilendirme (Python)
proxy_url = f"http://{login}:{password}@gate.proxyprovider.com:7777"

browser = p.chromium.launch(
    proxy={"server": proxy_url}
)

⚠️ Dikkat

Proxy'nin kullanıcı adı ve şifresini doğrudan kodda saklamayın! Ortam değişkenlerini kullanın (os.environ Python'da veya process.env Node.js'de) veya .env dosyasını dotenv kütüphanesi ile kullanın.

.env ile güvenli saklama (Python)

import os
from dotenv import load_dotenv
from playwright.sync_api import sync_playwright

load_dotenv()

PROXY_SERVER   = os.getenv("PROXY_SERVER")
PROXY_LOGIN    = os.getenv("PROXY_LOGIN")
PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server":   PROXY_SERVER,
            "username": PROXY_LOGIN,
            "password": PROXY_PASSWORD
        }
    )
    # ...

Proxy döngüsü: her istek için IP değişimi

Tek bir proxy, yüksek istek hacminde banı önlemez. Ciddi veri çekimi için IP döngüsü gereklidir — belirli aralıklarla veya her yeni istek için otomatik proxy sunucusu değişimi.

Playwright'te döngü için iki yaklaşım vardır:

Yaklaşım 1: Döngüsel proxy uç noktası

Çoğu ikametgah proxy sağlayıcısı, her bağlantıda otomatik olarak IP'yi değiştiren tek bir gateway adresi sağlar. Döngü mantığını yazmanıza gerek yoktur — bu, sağlayıcı tarafında yerleşiktir.

# Tek bir uç nokta — her tarayıcı bağlantısında yeni IP
browser = p.chromium.launch(
    proxy={
        "server":   "http://rotating.proxyprovider.com:8888",
        "username": "your_login",
        "password": "your_password"
    }
)

Yaklaşım 2: Proxy listesi ile manuel döngü

Statik proxy listeniz varsa, döngüyü manuel olarak uygulayabilirsiniz — her yineleme için yeni bir tarayıcı veya bağlam oluşturarak:

import random
from playwright.sync_api import sync_playwright

PROXY_LIST = [
    {"server": "http://proxy1.example.com:8080", "username": "user", "password": "pass"},
    {"server": "http://proxy2.example.com:8080", "username": "user", "password": "pass"},
    {"server": "http://proxy3.example.com:8080", "username": "user", "password": "pass"},
]

URLS_TO_SCRAPE = [
    "https://example.com/page1",
    "https://example.com/page2",
    "https://example.com/page3",
]

with sync_playwright() as p:
    for url in URLS_TO_SCRAPE:
        proxy = random.choice(PROXY_LIST)  # rastgele proxy
        
        browser = p.chromium.launch(proxy=proxy)
        page = browser.new_page()
        
        page.goto(url)
        # ... veri çekimi ...
        
        browser.close()  # tarayıcıyı kapat, IP değiştir

Yaklaşım 3: BrowserContext üzerinden döngü (tarayıcıyı yeniden başlatmadan)

with sync_playwright() as p:
    browser = p.chromium.launch()  # proxy olmadan tarayıcı
    
    for i, url in enumerate(URLS_TO_SCRAPE):
        proxy = PROXY_LIST[i % len(PROXY_LIST)]  # döngüsel
        
        # Yeni proxy ile yeni bir bağlam — tarayıcıyı yeniden başlatmaktan daha hızlı
        context = browser.new_context(proxy=proxy)
        page = context.new_page()
        
        page.goto(url)
        # ... veri çekimi ...
        
        context.close()  # bağlamı kapat, tarayıcıyı değil
    
    browser.close()

Üçüncü yaklaşım, toplu veri çekimi için en verimli olandır. Tarayıcıyı yeniden başlatmak 2-4 saniye alırken, yeni bir bağlam oluşturmak 100 milisaniyeden daha kısa sürer.

Bağlam ve sayfa düzeyinde proxy

Playwright, esnek bir mimariyi destekler: bir tarayıcı, her biri kendi proxy'sine sahip birden fazla izole bağlama sahip olabilir. Bu, tek bir işlem içinde birden fazla IP ile paralel çalışmanıza olanak tanır.

Farklı proxy'lere sahip birden fazla bağlam (paralel veri çekimi)

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();

  // Bağlam 1 — Almanya'dan proxy
  const context_de = await browser.newContext({
    proxy: {
      server: 'http://de-proxy.example.com:8080',
      username: 'user',
      password: 'pass'
    }
  });

  // Bağlam 2 — ABD'den proxy
  const context_us = await browser.newContext({
    proxy: {
      server: 'http://us-proxy.example.com:8080',
      username: 'user',
      password: 'pass'
    }
  });

  const page_de = await context_de.newPage();
  const page_us = await context_us.newPage();

  // Paralel başlatma
  await Promise.all([
    page_de.goto('https://example.com'),
    page_us.goto('https://example.com')
  ]);

  // Her iki sayfa farklı IP'leri görüyor
  console.log('DE IP:', await page_de.textContent('body'));
  console.log('US IP:', await page_us.textContent('body'));

  await browser.close();
})();

Bu yaklaşım, coğrafi konum testleri için mükemmeldir: aynı anda farklı ülkelerden kullanıcılar için sitenin nasıl göründüğünü kontrol ediyorsunuz, birden fazla tarayıcı örneği başlatmadan.

💡 Performans ipucu

Maksimum paralellik için Python'da asyncio veya Node.js'de Promise.all kullanın. Tek bir tarayıcı, önemli bir bellek yükü olmadan 10-20 paralel bağlamı tutabilir.

Anti-bot korumasının aşılması: Cloudflare, Akamai, DataDome

Proxy, çözümün sadece bir parçasıdır. Modern anti-bot sistemleri, tarayıcı parmak izi, fare davranışı, form doldurma hızı, HTTP başlıkları ve daha fazlası gibi birden fazla sinyali aynı anda analiz eder. İyi bir proxy ile bile, bu faktörler dikkate alınmazsa engellenebilirsiniz.

1. Headless modunu maskelemek

Playwright, headless modda belirgin özelliklere sahiptir: navigator.webdriver için özel değerler, eklenti eksikliği, standart dışı ekran boyutları. Maskeleme için playwright-stealth kütüphanesini kullanın:

# Python: kurulum
# pip install playwright-stealth

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server":   "http://residential.proxyprovider.com:8888",
            "username": "user",
            "password": "pass"
        }
    )
    page = browser.new_page()
    stealth_sync(page)  # maskeleme uygula
    
    page.goto("https://bot.sannysoft.com")  # bot tespiti testi
    browser.close()

2. Gerçekçi User-Agent ve viewport

context = browser.new_context(
    proxy={
        "server":   "http://proxy.example.com:8080",
        "username": "user",
        "password": "pass"
    },
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    viewport={"width": 1920, "height": 1080},
    locale="tr-TR",
    timezone_id="Europe/Istanbul"  # proxy'nin coğrafi konumu ile eşleşmelidir!
)

3. İnsan davranışını taklit etmek

import time
import random

# Eylemler arasında rastgele gecikmeler
def human_delay(min_ms=500, max_ms=2000):
    time.sleep(random.randint(min_ms, max_ms) / 1000)

page.goto("https://example.com")
human_delay()

# Anlık yerine yumuşak kaydırma
page.evaluate("window.scrollBy({top: 500, behavior: 'smooth'})")
human_delay(300, 800)

# Tıklamadan önce fare hareketi
page.mouse.move(100, 200)
human_delay(100, 300)
page.mouse.move(300, 400)
human_delay(100, 200)
page.click("button#submit")

4. Zaman diliminin proxy'nin coğrafi konumu ile eşleşmesi

Bu genellikle göz ardı edilir, ancak anti-bot sistemleri uyumluluğu kontrol eder: eğer proxy'niz Moskova'dan ise ve tarayıcı UTC-8 (Los Angeles) zaman dilimini gösteriyorsa — bu bir kırmızı bayraktır. Her zaman timezone_id'yi kullanılan proxy'nin coğrafi konumu ile eşleşecek şekilde ayarlayın.

Tipik hatalar ve nasıl düzeltilir

Playwright'te proxy ile çalışırken geliştiriciler sık sık aynı sorunlarla karşılaşır. Her birini belirli bir çözümle inceleyelim.

Hata 1: ERR_PROXY_CONNECTION_FAILED

Sebep: Proxy'nin yanlış adresi veya portu, proxy erişilemez, yanlış kimlik bilgileri.
Çözüm: Playwright'i başlatmadan önce proxy'nin erişilebilirliğini curl ile kontrol edin:

# Proxy'yi curl ile kontrol etme
curl -x http://user:[email protected]:8080 https://api.ipify.org

Hata 2: SOCKS5 yetkilendirmeyi kabul etmiyor

Sebep: Playwright (Chromium), username/password ile yetkilendirme için sınırlı destek sunar.
Çözüm: Yetkilendirme ile HTTP proxy kullanın veya şifresiz ssh -D ile yerel bir SOCKS5 tüneli ayarlayın.

Hata 3: Proxy çalışıyor, ancak site yine de engelliyor

Sebep: Kara listeye alınmış veri merkezi proxy'leri kullanılıyor; headless modu maskelememiş; istek sıklığı çok yüksek.
Çözüm: İkametgah veya mobil proxy'lere geçin, playwright-stealth ekleyin, istekler arasındaki gecikmeleri artırın.

Hata 4: Gerçek IP sızıntısı (DNS sızıntısı)

Sebep: DNS istekleri proxy'yi atlayabilir.
Çözüm: Playwright, HTTP proxy kullanırken varsayılan olarak DNS'yi proxy üzerinden yönlendirir. Ancak, headless tarayıcıda https://dnsleaktest.com ile kontrol edin.

Hata 5: Proxy ile yavaş çalışma

Sebep: İkametgah proxy'leri veri merkezi proxy'lerinden daha yavaş; proxy sunucusuna olan mesafe fazla.
Çözüm: Coğrafi olarak yakın konumlarda proxy seçin. Katı anonimlik gereksinimi olmayan görevler için veri merkezi proxy'leri kullanın — bunlar önemli ölçüde daha hızlıdır.

Hata Hızlı çözüm
ERR_PROXY_CONNECTION_FAILED curl'ü kontrol et, giriş/şifre, port erişilebilirliğini kontrol et
407 Proxy Auth Required Proxy konfigürasyonuna kullanıcı adı ve şifre ekleyin
Site CAPTCHA gösteriyor Proxy türünü ikametgah olarak değiştirin, stealth ekleyin
IP döngüsü sırasında değişmiyor İstekler arasında bağlamı/tarayıcıyı kapatın
Bağlantı zaman aşımı goto() içindeki zaman aşımını artırın, daha yakın bir proxy seçin

Sonuç ve öneriler

Playwright'te proxy ayarlamak, tek seferlik bir görev değil, otomasyon aracınızın mimarisinin bir parçasıdır. Doğru proxy türü seçimi, IP döngüsü ve headless modunun maskelemesi, agresif anti-bot korumasına sahip sitelerde bile stabil çalışmayı sağlar.

Belirli görevler için proxy türü seçimi konusunda özet geçelim:

  • Sıkı koruma olmadan açık verilerin çekimi — hızlı veri merkezi proxy'leri uygundur.
  • Pazar yerleri (Wildberries, Ozon), haber agregatörleri — ikametgah proxy'leri ile döngü gereklidir.
  • Sosyal medya (Instagram, Facebook, TikTok) ve Cloudflare ile siteler — yalnızca mobil veya ikametgah proxy'leri.
  • Coğrafi konum testi — gerekli ülkede herhangi bir proxy türü, önemli olan zaman diliminin eşleşmesidir.
  • Yüksek frekanslı toplu veri çekimi — döngüsel ikametgah proxy'leri ile gateway uç noktası.

Eğer Playwright üzerinde bir veri çekme veya otomatik test sistemi kuruyorsanız ve engel olmadan stabil bir çalışma istiyorsanız, ikametgah proxy'lerini düşünmenizi öneririz — bu proxy'ler, siteler tarafından yüksek güven seviyesine sahiptir ve IP döngüsünü tek bir uç nokta üzerinden destekler, bu da Playwright ile entegrasyonu birkaç kod satırına indirger.