Bloga geri dön

Web Scraping'de Ban Oranını %5'e Düşürmenin 12 Etkili Yöntemi

12 onaylanmış yöntemi inceliyoruz: proxy ayarlarından gerçek kullanıcı davranışının taklit edilmesine kadar ban oranını düşürme. Pratik örnekler ve hazır çözümler.

📅10 Şubat 2026
```html

Pazaryeri parsing'i, rakip fiyat izleme veya sitelerden veri toplama ile uğraşıyorsanız, şu sorunu biliyorsunuz: siteler IP adreslerini engelliyor, captcha istiyor veya boş sayfalar döndürüyor. Ban oranı (engellenen isteklerin yüzdesi) %70-90'a ulaşabilir ve bu da parsing'i imkansız hale getirir. Bu makalede ban oranını %5-10'a düşürmeye ve verileri istikrarlı bir şekilde toplamaya yardımcı olacak somut yöntemleri inceleyeceğiz.

Hem teknik çözümleri (proxy rotasyonu, HTTP başlıkları, fingerprinting) hem de davranışsal kalıpları (gecikmeler, kullanıcı eylemlerini taklit etme) ele alacağız. Tüm yöntemler Wildberries, Ozon, Avito ve yabancı platformların parsing'inde pratikte test edilmiştir.

Siteler neden parser'ları engelliyor: ana tetikleyiciler

Koruma yöntemlerini incelemeden önce, sitelerin otomatik trafiği nasıl tespit ettiğini anlamak önemlidir. Modern anti-bot sistemleri (Cloudflare, Akamai, DataDome, Imperva) her isteğin onlarca parametresini analiz eder. İşte ana engelleme tetikleyicileri:

Ağ seviyesinde tetikleyiciler:

  • Tek bir IP adresinden çok fazla istek (örneğin, dakikada 100+ istek)
  • Bilinen veri merkezi aralıklarından IP'ler (AWS, Google Cloud, Hetzner)
  • Coğrafi uyumsuzluk: Rusya'dan bir IP, sitenin İngilizce versiyonunu istiyor
  • IP adresi için ters DNS kaydının olmaması

HTTP seviyesinde tetikleyiciler:

  • Eksik veya yanlış HTTP başlıkları (User-Agent, Accept-Language, Referer)
  • Başlık sırası tarayıcı için standart olandan farklı
  • TLS/SSL sürümü belirtilen tarayıcıya uymuyor
  • Cookie'lerin olmaması veya yanlış kullanımı

Tarayıcı seviyesinde tetikleyiciler (JavaScript):

  • JavaScript yürütülmemesi (basit HTTP istemcisi kullanıyorsanız)
  • Browser fingerprinting: Canvas, WebGL, AudioContext, yüklü fontlar
  • Fare hareketi, kaydırma, tıklama olmaması
  • Tarayıcı pencere boyutu (headless tarayıcılar genellikle standart olmayan boyutlara sahiptir)
  • Otomasyon varlığı: navigator.webdriver, window.chrome özellikleri

Davranışsal tetikleyiciler:

  • Sayfalar arası çok hızlı gezinme (1 saniyeden az)
  • İstekler arasında aynı aralıklar (örneğin, tam olarak her 2 saniyede bir)
  • Sayfaların sıralı gezilmesi (1, 2, 3, 4...) atlama olmadan
  • Tipik kullanıcı eylemlerinin olmaması: arama, filtreler, görsel görüntüleme

Örneğin, Wildberries parsing'inde tipik hata — tek bir IP'den her 0.5 saniyede bir istek göndermek. Cloudflare anti-bot sistemi kalıbı anında tespit eder ve IP'yi 24 saat boyunca engeller. Gerçek bir kullanıcı ürün kartını görüntülemek için 5-15 saniye harcar, sayfayı kaydırır, görsellere tıklar.

Proxy rotasyonu: IP adreslerini doğru şekilde değiştirme

Proxy kullanımı — ban oranını düşürmenin temel yöntemidir. Ancak sadece proxy satın almak değil, rotasyonu doğru şekilde yapılandırmak önemlidir. İşte kanıtlanmış stratejiler:

Parsing için proxy türü seçimi

Proxy türü Ban oranı Hız Ne zaman kullanılır
Veri merkezi proxy'leri Yüksek (%40-60) Çok yüksek Korumasız basit siteler, büyük IP havuzu ile toplu parsing
Residential proxy'ler Düşük (%5-15) Orta Pazaryerleri (Wildberries, Ozon), Cloudflare'li siteler, sosyal ağlar
Mobil proxy'ler Çok düşük (%2-8) Düşük Agresif korumalı siteler, mobil uygulama sürümleri

Pazaryeri parsing'i (Wildberries, Ozon, Avito) için residential proxy'ler önerilir — gerçek ev kullanıcılarının IP'lerine sahiptirler ve normal trafikten ayırt edilmeleri zordur. Veri merkezi proxy'leri daha az korumalı siteler için veya büyük veri hacminde maksimum hız gerektiğinde uygundur.

IP adresi rotasyon stratejileri

Strateji 1: Zamana göre rotasyon

IP'yi her 5-10 dakikada bir değiştirin. Bu optimal dengedir: sık değişimle şüphe uyandırmayacak kadar uzun, ancak tek bir IP'de istek geçmişi biriktirmeyecek kadar sık.

Örnek: İstekler arası 3 saniyelik aralıkla 1000 ürünlük kataloğu parse ederken, bir IP yaklaşık 100 istek boyunca aktif olacak, ardından değişim gerçekleşecektir.

Strateji 2: İstek sayısına göre rotasyon

50-150 istekten sonra IP'yi değiştirin. Bu, tek bir adreste şüpheli aktivite birikmesini önlemeye yardımcı olur. Rastgelelik ekleyin: tam olarak 100 istek değil, 80 ile 120 arası.

Örnek: Script'i rastgele sayıda istekten (80-120) sonra havuzdan proxy rotasyonu yapacak şekilde yapılandırın.

Strateji 3: Sticky sessions (oturum proxy'leri)

Yetkilendirme gerektiren veya sepet ile çalışan siteler için sticky sessions kullanın — oturum süresi boyunca (10-30 dakika) IP sabitleme. Bu, cookie'leri korumaya ve bir oturum içinde IP değişiminde şüphe uyandırmamaya olanak tanır.

Örnek: Ozon'da kişisel hesap parsing'inde, giriş ve 15 dakikalık oturum çerçevesindeki tüm sonraki istekler için tek bir IP kullanın.

Önemli: Farklı görevler için aynı IP'yi kullanmayın. Bir sitede parsing sırasında IP engellenirse, hemen başka bir site için kullanmayın — 24-48 saat bekleyin.

Proxy havuzu boyutu

Minimum havuz boyutu parsing yoğunluğuna bağlıdır:

  • Düşük yoğunluk (günde 10.000'e kadar istek): 10-20 proxy
  • Orta yoğunluk (günde 10.000 - 100.000 istek): 50-100 proxy
  • Yüksek yoğunluk (günde 100.000'den fazla istek): 200+ proxy veya otomatik rotasyonlu residential

Her istek için rotasyonlu residential proxy'ler (rotating proxies) için havuz boyutu daha küçük olabilir, çünkü sağlayıcı milyonlarca adres havuzundan otomatik olarak yeni IP atar.

User-Agent ve HTTP başlıkları: gerçek tarayıcıyı taklit etme

İyi proxy'lerle bile, HTTP başlıkları şüpheli görünüyorsa engellenebilirsiniz. Siteler sadece User-Agent'ı değil, başlıkların sırasını, değerlerini ve birbirleriyle uyumunu da analiz eder.

Doğru User-Agent

Tüm istekler için aynı User-Agent'ı kullanmayın. Popüler tarayıcıların bir listesini oluşturun ve rastgele seçin:

user_agents = [
    # Windows'ta Chrome
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    # macOS'ta Chrome
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    # Windows'ta Firefox
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
    # macOS'ta Safari
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
    # Windows'ta Edge
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"
]

Hata: Eski tarayıcı sürümlerini kullanmak (örneğin, Chrome 80) — bu hemen şüphe uyandırır. User-Agent listesini her 2-3 ayda bir güncelleyin, whatismybrowser.com sitesinde güncel sürümleri takip edin.

Tam HTTP başlıkları seti

Modern tarayıcılar 15-20 başlık gönderir. İşte Chrome'u taklit etmek için minimum gerekli set:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language": "tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7",
    "Accept-Encoding": "gzip, deflate, br",
    "DNT": "1",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Cache-Control": "max-age=0",
    "sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"Windows"'
}

Sec-Fetch-* ve sec-ch-ua-* başlıklarına dikkat edin — bunlar Chrome'un yeni sürümlerinde ortaya çıktı ve yoklukları otomasyonu ele verebilir.

Başlık sırası önemlidir

Tarayıcılar başlıkları belirli bir sırada gönderir. Örneğin, Chrome her zaman Host'u ilk sıraya koyar, ardından Connection, User-Agent vb. Python kütüphanesi requests kullanıyorsanız, sıra alfabetik olabilir ve bu otomasyonu ele verir.

Çözüm: başlıkları doğru şekilde oluşturan kütüphaneleri kullanın (Python için curl_cffi, Node.js için got) veya gerçek tarayıcı gibi başlık üreten headless tarayıcılar (Puppeteer, Playwright, Selenium).

İstekler arası gecikmeler: optimal aralıklar

Ban oranını düşürmenin en basit ama etkili yöntemlerinden biri — istekler arası doğru gecikmelerdir. Gerçek bir kullanıcı saniyede 10 sayfa açamaz, bu nedenle çok hızlı istekler anında engellemeye neden olur.

Sabit yerine rastgele gecikmeler

Sabit gecikme kullanmayın (örneğin, istekler arası tam 2 saniye). Anti-bot sistemleri böyle bir kalıbı kolayca tespit eder. Rastgele aralık kullanın:

import random
import time

# Sabit gecikme yerine
time.sleep(2)  # ❌ Kötü

# Rastgele aralık kullanın
delay = random.uniform(2.5, 5.5)  # ✅ İyi
time.sleep(delay)

Farklı siteler için önerilen aralıklar

Site türü Minimum gecikme Önerilen gecikme Örnekler
Korumalı pazaryerleri 3-5 sn 5-10 sn Wildberries, Ozon, Lamoda
İlan panoları 2-4 sn 4-8 sn Avito, Yula, CIAN
Haber siteleri 1-2 sn 2-4 sn RBC, Kommersant, Vedomosti
Kısıtlamasız API 0.5-1 sn 1-2 sn Açık API'ler, RSS beslemeleri

Sunucu yanıtlarına dayalı uyarlanabilir gecikmeler

Gelişmiş yaklaşım — sunucu yanıtlarına bağlı olarak gecikmeleri dinamik olarak değiştirmek:

base_delay = 3.0  # Temel gecikme
delay_multiplier = 1.0

response = requests.get(url, headers=headers, proxies=proxies)

# Captcha veya 429 aldıysak — gecikmeyi artırıyoruz
if response.status_code == 429 or 'captcha' in response.text.lower():
    delay_multiplier *= 1.5
    print(f"Koruma tespit edildi, gecikme {base_delay * delay_multiplier}sn'ye artırılıyor")

# Her şey yolundaysa — biraz hızlanabiliriz
elif response.status_code == 200:
    delay_multiplier = max(1.0, delay_multiplier * 0.95)

time.sleep(random.uniform(base_delay * delay_multiplier, base_delay * delay_multiplier * 1.5))

Bu yaklaşım, koruma tespit edildiğinde otomatik olarak yavaşlamaya ve site agresif davranmadığında hızlanmaya olanak tanır.

Fingerprinting'den korunma: Canvas, WebGL, fontlar

Site kontrol için JavaScript kullanıyorsa, basit HTTP başlıkları yeterli değildir. Modern anti-bot sistemleri onlarca parametreye dayalı tarayıcı "parmak izi" (fingerprint) oluşturur: Canvas, WebGL, yüklü fontlar, saat dilimi, ekran çözünürlüğü ve diğerleri.

Ana fingerprinting parametreleri

Canvas fingerprinting

Site Canvas'ta görünmez bir görüntü çizer ve okur. Farklı tarayıcılar ve işletim sistemleri görüntüyü farklı şekilde render eder, benzersiz bir parmak izi oluşturur. Headless tarayıcılar genellikle aynı Canvas'ı üretir, bu da otomasyonu ele verir.

WebGL fingerprinting

Canvas'a benzer, ancak 3D render kullanır. Ekran kartı, sürücüler, desteklenen uzantılar hakkında bilgi okunur. Headless tarayıcılar genellikle gerçek GPU yerine yazılım render (SwiftShader) gösterir.

Yüklü fontlar

JavaScript yüklü fontların listesini belirleyebilir. Headless tarayıcılar genellikle minimum sistem fontu setine sahiptir, bu da Microsoft Office, Adobe ve diğer programların yüklü olduğu gerçek kullanıcıdan farklıdır.

Navigator özellikleri

navigator.webdriver, navigator.plugins, navigator.languages özellikleri otomasyonu ele verir. Örneğin, Selenium'da navigator.webdriver === true, bu da anti-bot sistemleri tarafından anında tespit edilir.

Fingerprinting'i aşmak için araçlar

Fingerprinting'i aşmak için özel araçlar kullanın:

  • Undetected ChromeDriver (Python) — otomasyon işaretlerini gizleyen değiştirilmiş Selenium sürümü
  • Puppeteer Stealth (Node.js) — fingerprint parametrelerini değiştiren Puppeteer eklentisi
  • Stealth ile Playwright — Puppeteer'a benzer, ancak farklı tarayıcılar için daha iyi destek
  • Anti-detect tarayıcılar (Dolphin Anty, AdsPower, Multilogin) — kod yazmak istemeyenler için, bu tarayıcılar otomatik olarak fingerprint'i değiştirir

Python'da undetected-chromedriver kullanım örneği:

import undetected_chromedriver as uc

# Tespitten korunmalı tarayıcı oluşturuyoruz
options = uc.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')

driver = uc.Chrome(options=options)
driver.get('https://example.com')

# navigator.webdriver === undefined olduğunu kontrol ediyoruz
webdriver_status = driver.execute_script("return navigator.webdriver")
print(f"navigator.webdriver: {webdriver_status}")  # None/undefined olmalı

Cookie'leri ve oturumları yönetme

Birçok site kullanıcı davranışını izlemek için cookie'leri kullanır. Cookie'lerin doğru yönetimi engellenmekten kaçınmaya ve gerçek kullanıcı gibi görünmeye yardımcı olur.

Cookie'leri kaydetme ve yeniden kullanma

Her istek için yeni oturum oluşturmak yerine, cookie'leri kaydedin ve tekrar kullanın. Bu, siteye geri dönen gerçek bir kullanıcıyı taklit eder:

import requests
import pickle

session = requests.Session()

# İlk ziyaret — cookie'leri alıyoruz
response = session.get('https://example.com')

# Cookie'leri dosyaya kaydediyoruz
with open('cookies.pkl', 'wb') as f:
    pickle.dump(session.cookies, f)

# Daha sonra cookie'leri yüklüyoruz
with open('cookies.pkl', 'rb') as f:
    session.cookies.update(pickle.load(f))

# Şimdi istekler geri dönen kullanıcıdan gibi görünüyor
response = session.get('https://example.com/catalog')

Parsing'den önce oturumu ısıtma

Hemen hedef sayfalarla parsing'e başlamayın. Gerçek kullanıcı davranışını taklit edin:

  1. Sitenin ana sayfasını açın
  2. 2-5 saniye bekleyin
  3. Kategori veya bölüm sayfasını açın
  4. 3-7 saniye bekleyin
  5. Ancak bundan sonra hedef sayfaları parse etmeye başlayın

Bu, cookie'lerde aktivite geçmişi oluşturur ve engelleme olasılığını azaltır.

Session cookie'leri ve token'ları işleme

Bazı siteler ilk ziyarette benzersiz token'lar üretir ve sonraki isteklerde bunları kontrol eder. Örneğin, Wildberries x-requested-with başlığında token kullanır. Her zaman bu token'ları ilk yanıttan kaydedin ve sonraki isteklerde gönderin.

JavaScript render etme: ne zaman gereklidir

Birçok modern site içeriği JavaScript aracılığıyla yükler. Basit HTTP istemcisi (Python'da requests, Node.js'de axios) kullanıyorsanız, boş sayfa veya yer tutucu alırsınız. Bu durumlarda JavaScript render etme gereklidir.

JavaScript render etme ne zaman gereklidir

  • Site React, Vue, Angular kullanıyor — içerik ilk sayfa yüklemesinden sonra yükleniyor
  • Veriler AJAX/Fetch istekleri aracılığıyla yükleniyor
  • Site token veya cookie üretmek için JavaScript yürütme gerektiriyor
  • JS kodu yürütme gerektiren bot koruması mevcut (örneğin, Cloudflare Challenge)

JavaScript render etme araçları

Araç Dil Hız Korumayı aşma
Selenium Python, Java, C# Yavaş Orta (undetected-chromedriver ile)
Puppeteer Node.js Orta İyi (puppeteer-extra-plugin-stealth ile)
Playwright Python, Node.js, Java Hızlı Mükemmel
Splash HTTP API Orta Zayıf

Çoğu görev için Playwright önerilir — Selenium'dan daha hızlıdır, korumayı daha iyi aşar ve daha kullanışlı bir API'ye sahiptir.

Alternatif: API isteklerini yakalama

Genellikle sitenin veri yüklemek için kullandığı API isteklerini bulursanız JavaScript render etmekten kaçınabilirsiniz. DevTools'u (F12) açın → Network sekmesi → XHR/Fetch filtresi ve sitenin hangi istekleri gönderdiğine bakın. Ardından bu istekleri doğrudan HTTP istemcisi aracılığıyla tekrarlayın.

Örnek: Wildberries ürün verilerini https://catalog.wb.ru/catalog/... API'si aracılığıyla yükler. Tüm sayfayı render etmek yerine bu API'yi doğrudan sorgulayabilirsiniz, bu 10-20 kat daha hızlıdır.

Captcha'yı aşma: otomatik çözümler

Doğru proxy'ler ve başlıklarla bile captcha ile karşılaşabilirsiniz. Çözümü için birkaç yaklaşım vardır:

Captcha türleri ve çözüm yöntemleri

reCAPTCHA v2 ("Robot değilim" onay kutusu)

Tanıma servisleri aracılığıyla çözülür: 2Captcha, Anti-Captcha, CapMonster. Maliyet: 1000 çözüm için $1-3. Çözüm süresi: 10-30 saniye.

reCAPTCHA v3 (görünmez, puan tabanlı)

Daha karmaşık. Kullanıcı davranışını analiz eder ve 0'dan 1'e puan verir. Aşma: doğru fingerprint ile headless tarayıcılar kullanma + kullanıcı eylemlerini taklit etme (fare hareketi, tıklamalar).

hCaptcha

reCAPTCHA'nın benzeri, birçok sitede kullanılır. Aynı tanıma servisleri aracılığıyla çözülür. Maliyet: 1000 çözüm için $0.5-2.

Cloudflare Challenge

Tarayıcıyı kontrol eden JavaScript-challenge. Aşma: özel kütüphaneler (Python için cloudscraper, Node.js için cloudflare-scraper) veya servisler (FlareSolverr) kullanma.

Captcha tanıma servisini entegre etme

Python'da 2Captcha entegrasyon örneği:

from twocaptcha import TwoCaptcha

solver = TwoCaptcha('YOUR_API_KEY')

try:
    # reCAPTCHA v2'yi çözüyoruz
    result = solver.recaptcha(
        sitekey='6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
        url='https://example.com'
    )
    
    # Çözüm token'ını alıyoruz
    captcha_token = result['code']
    
    # Token ile formu gönderiyoruz
    response = requests.post('https://example.com/submit', data={
        'g-recaptcha-response': captcha_token
    })
    
except Exception as e:
    print(f"Captcha çözme hatası: {e}")

Önemli: Captcha çözme parsing'i 10-30 kat yavaşlatır ve maliyeti artırır. Yalnızca diğer yöntemler işe yaramadığında kullanın. Önce proxy, fingerprint ve gecikmeleri iyileştirmeyi deneyin.

Rate limiting: sitenin limitlerini aşmama

Birçok sitenin istek sayısı için açık veya örtük limitleri vardır. Bu limitlerin aşılması IP'nin geçici veya kalıcı engellenmesine yol açar.

Sitenin limitlerini belirleme

Sunucu yanıtlarındaki HTTP başlıklarına dikkat edin:

  • X-RateLimit-Limit — dönem içindeki maksimum istek sayısı
  • X-RateLimit-Remaining — kalan istek sayısı
  • X-RateLimit-Reset — limitin ne zaman sıfırlanacağı (Unix timestamp)
  • Retry-After — isteği kaç saniye sonra tekrarlayabileceğiniz

429 (Too Many Requests) durum kodu aldıysanız, bu limit aşımı anlamına gelir. Retry-After başlığını okuyun ve bir sonraki istekten önce belirtilen süre kadar bekleyin.

Rate limiter uygulama

İstek hızı kontrol mekanizması oluşturun:

import time
from collections import deque

class RateLimiter:
    def __init__(self, max_requests, time_window):
        self.max_requests = max_requests  # Maksimum istek sayısı
        self.time_window = time_window    # Zaman penceresi (saniye)
        self.requests = deque()
    
    def wait_if_needed(self):
        now = time.time()
        
        # Zaman penceresinin dışındaki istekleri kaldır
        while self.requests and self.requests[0] < now - self.time_window:
            self.requests.popleft()
        
        # Limite ulaştıysak bekle
        if len(self.requests) >= self.max_requests:
            sleep_time = self.time_window - (now - self.requests[0])
            if sleep_time > 0:
                print(f"Rate limit, {sleep_time:.2f} saniye bekleniyor...")
                time.sleep(sleep_time)
                self.requests.popleft()
        
        self.requests.append(time.time())

# Kullanım: dakikada maksimum 60 istek
limiter = RateLimiter(max_requests=60, time_window=60)

for url in urls:
    limiter.wait_if_needed()
    response = requests.get(url)

Metrikleri izleme: ban oranını takip etme

Parsing'in etkinliğini değerlendirmek için temel metrikleri izleyin:

İzlenecek temel metrikler

Ban oranı (Ban Rate)

Engellenen isteklerin toplam isteklere oranı. Formül: (engellenen_istekler / toplam_istekler) * 100%

Hedef: %5'in altında. %10-20 — kabul edilebilir. %30'un üzerinde — stratejiyi gözden geçirin.

Başarı oranı (Success Rate)

Başarılı isteklerin yüzdesi (200 durum kodu + beklenen içerik). Formül: (başarılı_istekler / toplam_istekler) * 100%

Hedef: %95'in üzerinde.

Ortalama yanıt süresi

Bir isteğin ortalama işleme süresi. Ani artış — sunucu yükü veya koruma aktivasyonu işareti olabilir.

Captcha oranı

Captcha ile karşılaşılan isteklerin yüzdesi. Formül: (captcha_istekleri / toplam_istekler) * 100%

Hedef: %2'nin altında.

Metrik toplama örneği

class ScraperMetrics:
    def __init__(self):
        self.total_requests = 0
        self.successful_requests = 0
        self.blocked_requests = 0
        self.captcha_requests = 0
        self.response_times = []
    
    def record_request(self, status_code, response_time, has_captcha=False):
        self.total_requests += 1
        self.response_times.append(response_time)
        
        if has_captcha:
            self.captcha_requests += 1
        
        if status_code == 200:
            self.successful_requests += 1
        elif status_code in [403, 429, 503]:
            self.blocked_requests += 1
    
    def get_stats(self):
        if self.total_requests == 0:
            return {}
        
        return {
            'ban_rate': (self.blocked_requests / self.total_requests) * 100,
            'success_rate': (self.successful_requests / self.total_requests) * 100,
            'captcha_rate': (self.captcha_requests / self.total_requests) * 100,
            'avg_response_time': sum(self.response_times) / len(self.response_times),
            'total_requests': self.total_requests
        }

# Kullanım
metrics = ScraperMetrics()

for url in urls:
    start_time = time.time()
    response = requests.get(url)
    response_time = time.time() - start_time
    
    has_captcha = 'captcha' in response.text.lower()
    metrics.record_request(response.status_code, response_time, has_captcha)

# İstatistikleri yazdır
stats = metrics.get_stats()
print(f"Ban oranı: {stats['ban_rate']:.2f}%")
print(f"Başarı oranı: {stats['success_rate']:.2f}%")
print(f"Captcha oranı: {stats['captcha_rate']:.2f}%")

Parsing araçlarının karşılaştırılması

Farklı görevler için farklı araçlar uygundur. İşte popüler çözümlerin karşılaştırması:

Araç Avantajlar Dezavantajlar En iyi kullanım
Requests + BeautifulSoup Çok hızlı, basit, düşük kaynak tüketimi JS yok, zayıf koruma aşma Statik siteler, API'ler, basit görevler
Scrapy Yüksek performans, yerleşik araçlar, ölçeklenebilir Öğrenme eğrisi, JS için ek araçlar gerekli Büyük projeler, çok sayıda site
Selenium Tam tarayıcı emülasyonu, JS desteği Yavaş, yüksek kaynak tüketimi, kolay tespit Karmaşık JS, form doldurma
Playwright Hızlı, modern API, iyi koruma aşma Kaynak tüketimi, ek yapılandırma gerekli Modern siteler, SPA, orta koruma
Puppeteer Stealth eklentileri, iyi dokümantasyon Sadece Node.js, kaynak tüketimi Node.js projeleri, JS ağırlıklı siteler

Görev türüne göre öneriler

  • Basit katalog parsing'i (statik HTML): Requests + BeautifulSoup veya Scrapy
  • Orta koruma ile pazaryerleri: Playwright + residential proxy'ler
  • Agresif koruma (Cloudflare, DataDome): Undetected ChromeDriver veya anti-detect tarayıcılar
  • API parsing'i: Requests + API isteklerini yakalama (DevTools)
  • Büyük ölçekli projeler: Scrapy + proxy rotasyonu + dağıtık mimari

Sonuç

Ban oranını düşürmek kapsamlı bir yaklaşım gerektirir. Tek bir "sihirli değnek" yoktur — proxy, başlıklar, gecikmeler, fingerprinting ve davranış taklidinin kombinasyonu gereklidir. İşte ana öneriler:

Minimum gereksinimler (ban oranı %20-30):

  • Veri merkezi proxy'leri ile rotasyon (10-20 IP)
  • Rastgele User-Agent
  • İstekler arası 2-5 saniye gecikme
  • Temel HTTP başlıkları

Önerilen yapılandırma (ban oranı %5-10):

  • Residential proxy'ler (50+ IP) veya otomatik rotasyon
  • Tam HTTP başlıkları seti (doğru sırayla)
  • Rastgele gecikmeler (3-10 saniye)
  • Cookie'leri kaydetme ve oturum ısıtma
  • Rate limiting
  • Metrikleri izleme

Maksimum koruma (ban oranı %2-5):

  • Residential veya mobil proxy'ler (100+ IP)
  • Playwright/Puppeteer Stealth veya anti-detect tarayıcılar
  • Fingerprint koruması (Canvas, WebGL, fontlar)
  • Kullanıcı davranışını taklit etme (fare hareketi, kaydırma)
  • Uyarlanabilir gecikmeler
  • Captcha çözme (gerekirse)
  • Detaylı metrik izleme ve strateji optimizasyonu

En önemlisi — sürekli test edin ve stratejinizi optimize edin. Siteler korumalarını günceller, bu nedenle bugün işe yarayan yarın işe yaramayabilir. Metrikleri izleyin, değişikliklere hızlı tepki verin ve parsing'iniz istikrarlı ve verimli olacaktır.

Kaliteli proxy'lere ihtiyacınız varsa, ProxyCove hizmetine göz atın — parsing için optimize edilmiş residential ve mobil proxy'ler, otomatik rotasyon ve 24/7 destek.

```