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:
- Sitenin ana sayfasını açın
- 2-5 saniye bekleyin
- Kategori veya bölüm sayfasını açın
- 3-7 saniye bekleyin
- 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.