Scrapy'de proxy rotasyonu, hedef sunucuların scraping etkinliğini tespit edip engellemesini önlemek için her giden istekte kullanılan IP adresini sistematik olarak değiştirme sürecidir. Trafiği çeşitli IP adreslerinden oluşan bir havuza dağıtarak geliştiriciler hız sınırlarını aşabilir, IP tabanlı banları atlatabilir ve yüksek güvenlikli sitelerden başarıyla veri çekebilir.
Anti-bot sistemlerinin ve IP takibinin işleyişi
Modern web sunucuları gelişmiş Web Application Firewall'lar (WAF) ve Cloudflare, Akamai ya da DataDome gibi anti-bot çözümleri kullanır. Bu sistemler gelen trafiği, insan davranışından sapan desenler açısından izler. Takip ettikleri temel sinyallerden biri, tek bir IP adresinden gelen istek sıklığıdır. Bir Scrapy spider'ı sabit bir IP'den dakikada yüzlerce istek gönderdiğinde "Rate Limit Exceeded" (HTTP 429) veya "Forbidden" (HTTP 403) yanıtını tetikler.
Anti-bot sistemleri IP adresinin itibarını da analiz eder. AWS veya DigitalOcean gibi bulut sağlayıcılarına ait veri merkezi IP'leri, gerçek kullanıcılar tarafından nadiren kullanıldıkları için sıklıkla işaretlenir. Buna karşılık internet servis sağlayıcılarının (ISP) ev kullanıcılarına atadığı residential IP'ler daha yüksek güven taşır. Etkili scraping, GProxy'nin residential ağı gibi kaliteli IP kaynaklarını organik trafiği taklit eden bir rotasyon mantığıyla birleştiren bir strateji gerektirir.
Basit IP takibinin ötesinde, gelişmiş sistemler "IP Fingerprinting" kullanır. Bu, bir IP adresini User-Agent, TLS handshake desenleri ve HTTP/2 frame ayarları gibi diğer istek özellikleriyle ilişkilendirmek anlamına gelir. IP dönse bile TLS parmak izi sabit kalıyor ve Scrapy varsayılanı olarak tanınıyorsa, bot tespit sistemi bağlantıyı yine de engeller.
Scrapy'de temel proxy rotasyonunu uygulama
Scrapy proxy'leri, varsayılan olarak etkin olan HttpProxyMiddleware üzerinden yönetir. Belirli bir istek için proxy kullanmak istiyorsanız Request.meta sözlüğünde proxy anahtarını ayarlamanız gerekir. Ancak bir spider içinde yüzlerce IP'den oluşan bir listeyi elle yönetmek verimsizdir ve bakımı zordur.
Temel bir uygulama, settings.py dosyanızda bir proxy listesi tanımlamayı ve her istek için bunlardan birini seçen özel bir middleware yazmayı içerir. Bu yaklaşım, statik bir veri merkezi IP listesi kullanan küçük ölçekli projeler için uygundur.
# settings.py
PROXY_LIST = [
'http://user:[email protected]:8080',
'http://user:[email protected]:8080',
'http://user:[email protected]:8080',
]
# middlewares.py
import random
class RandomProxyMiddleware:
def __init__(self, settings):
self.proxies = settings.get('PROXY_LIST')
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings)
def process_request(self, request, spider):
request.meta['proxy'] = random.choice(self.proxies)
Bunu etkinleştirmek için middleware'i settings.py içindeki DOWNLOADER_MIDDLEWARES sözlüğüne eklemeli ve varsayılan HttpProxyMiddleware'den (750) daha düşük bir önceliğe sahip olmasını sağlamalısınız.

İleri düzey rotasyon stratejileri: back-connect proxy'ler
İstemci tarafı rotasyon (listeyi kendi kodunuzda yönetmek) küçük havuzlar için işe yarasa da kurumsal ölçekli scraping back-connect proxy gerektirir. Back-connect proxy tek bir endpoint sunar (örneğin proxy.gproxy.com:8000). Scrapy spider'ınız bu endpoint'e bağlandığında, proxy sağlayıcısının sunucusu ilgili oturum veya istek için havuzundan otomatik olarak yeni bir IP atar.
Bu yöntemin birkaç avantajı var:
- Daha sade kod tabanı: Scrapy ayarlarınızda yalnızca tek bir proxy URL'si yönetirsiniz.
- Otomatik IP yönetimi: rotasyonu, sağlık kontrollerini ve kara listeye alınmış IP'lerin değiştirilmesini sağlayıcı üstlenir.
- Oturum sürekliliği: çoğu back-connect hizmeti, kimlik doğrulama string'inde bir oturum kimliği kullanarak belirli bir süre boyunca aynı IP'ye "yapışmanıza" izin verir.
GProxy'nin back-connect residential proxy'lerini Scrapy'ye entegre etmek kolaydır. Proxy ayarlarını global olarak yapılandırırsınız, rotasyon ise GProxy altyapısı tarafında şeffaf biçimde gerçekleşir.
# GProxy back-connect için settings.py
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
}
# Proxy kimlik doğrulama (GProxy formatı)
HTTP_PROXY = "http://username-session-12345:[email protected]:8000"
# Spider'ınızda veya bir middleware içinde
def process_request(self, request, spider):
request.meta['proxy'] = HTTP_PROXY
Scrapy spider'ları için proxy türlerinin karşılaştırması
Doğru proxy türünü seçmek, scraping kampanyanızın başarısı açısından kritiktir. Aşağıdaki tablo, Scrapy ortamlarında kullanılan üç ana proxy kategorisini karşılaştırıyor.
| Proxy türü | Tespit riski | Ortalama hız | Maliyet verimliliği | En uygun kullanım |
|---|---|---|---|---|
| Veri merkezi | Yüksek | Çok yüksek | Yüksek | Korumasız siteler, yüksek hızlı test |
| Residential | Çok düşük | Orta | Orta | E-ticaret, sosyal medya, SEO takibi |
| Mobil (4G/5G) | En düşük | Değişken | Düşük | Çok agresif anti-bot sistemleri |
Profesyonel scraping işlerinin çoğunda residential proxy'ler sektör standardıdır. Anonimlik ile performans arasında en iyi dengeyi sunarlar. GProxy, gerçek kullanıcılardan ayırt edilemeyen geniş bir residential IP havuzu sağlar ve bu da CAPTCHA veya 403 hatasıyla karşılaşma olasılığını belirgin biçimde düşürür.

Proxy hatalarını ve yeniden denemeleri yönetme
Hiçbir proxy havuzu %100 kararlı değildir. IP'ler çevrimdışı olabilir ya da belirli bir IP, diğerleri çalışmaya devam ederken hedef site tarafından engellenebilir. Sağlam bir Scrapy mimarisi bu hataları veri kaybetmeden düzgün biçimde ele almalıdır.
Scrapy'nin yerleşik RetryMiddleware'i ilk savunma hattınızdır. Varsayılan olarak 500, 502, 503, 504, 408 veya 429 durum kodlarıyla sonuçlanan istekleri yeniden dener. Engelin IP kaynaklı olduğundan şüpheleniyorsanız bunu 403'ü (Forbidden) de kapsayacak şekilde özelleştirmelisiniz.
Yeniden deneme mantığını özelleştirme
settings.py içinde hangi durum kodlarının yeniden denemeyi tetikleyeceğini ve bir isteğin vazgeçilmeden önce kaç kez denenmesi gerektiğini tanımlayabilirsiniz.
RETRY_TIMES = 5
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 408, 429]
# İsteğe bağlı: her yeniden denemede proxy'yi değiştiren özel middleware
class RetryWithNewProxyMiddleware(RetryMiddleware):
def _retry(self, request, reason, spider):
# GProxy'den yeni bir IP veya oturum kimliği seçme mantığı
new_session = random.randint(1, 99999)
request.meta['proxy'] = f"http://user-session-{new_session}:[email protected]:8000"
return super()._retry(request, reason, spider)
Bu sayede bir IP işaretlendiğinde Scrapy aynı engellenmiş IP'yi tekrar denemekle vakit kaybetmez. Bunun yerine proxy sağlayıcısından yeni bir kimlik ister ve taramaya devam eder.
IP'nin ötesi: rotasyonu header'larla senkronize etmek
IP döndürmek işin yalnızca yarısıdır. 5.000 farklı IP kullanıp aynı User-Agent ve Accept-Language header'larını gönderirseniz, anti-bot sistemleri istekleri kolayca birbirine bağlar. Tespiti gerçekten aşmak için tarayıcı header'larınızı proxy'lerinizle eşzamanlı olarak döndürmelisiniz.
Her isteğe rastgele ve gerçekçi bir User-Agent enjekte etmek için scrapy-user-agents paketini veya özel bir middleware'i kullanabilirsiniz. Yüksek güvenlikli hedeflerde, User-Agent'larınızın iddia ettikleri tarayıcının beklenen TLS parmak iziyle uyuştuğundan emin olun. Örneğin User-Agent'ınız Windows'ta Chrome kullandığınızı söylüyorsa, istek header'larınız Windows'taki Chrome'un kullandığı sıralamaya ve büyük-küçük harf düzenine uymalıdır.
- User-Agent: Chrome, Firefox ve Safari'nin güncel sürümleri arasında rotasyon yapın.
- Referer: zaman zaman bir arama motorundan veya sitenin kendi ana sayfasından gelen bir referer ayarlayın.
- Accept-Language: dili proxy IP'nizin coğrafi konumuyla eşleştirin.
Eşzamanlı isteklerle performansı optimize etme
Proxy rotasyonu kullanırken Scrapy'deki CONCURRENT_REQUESTS ayarını belirgin biçimde artırabilirsiniz. Her istek farklı bir IP'den geldiği için hedef sunucunun IP başına hız sınırı artık darboğaz olmaz. Yine de CPU ve bellek kullanımınızı ve proxy paketinizin bant genişliği limitlerini izlemelisiniz.
GProxy residential IP'leriyle dağıtık bir tarama için tipik bir yapılandırma şöyle olabilir:
# settings.py
CONCURRENT_REQUESTS = 32
CONCURRENT_REQUESTS_PER_DOMAIN = 32
AUTOTHROTTLE_ENABLED = False
DOWNLOAD_DELAY = 0 # Kaliteli rotasyonda gecikmeye gerek yok
AUTOTHROTTLE tek IP üzerinden nazik scraping için mükemmel olsa da büyük bir rotasyonlu havuz kullanırken ters etki yapabilir. Elinizde 10.000+ IP varsa, hedef sitenin altyapısı yükü çökmeden kaldırabildiği sürece download delay'i fiilen sıfırlayabilirsiniz.
Önemli çıkarımlar
Ölçekli web scraping'de başarı, anonimliğe çok katmanlı bir yaklaşım gerektirir. Proxy rotasyonu bu stratejinin temelidir, ancak etkinliği IP havuzunun kalitesine ve rotasyon mantığının olgunluğuna bağlıdır.
- Residential proxy kullanın: temel bot korumasına sahip her sitede, GProxy gibi sağlayıcıların residential IP'leri veri merkezi IP'lerine göre belirgin şekilde daha yüksek başarı oranı sunar.
- Back-connect endpoint'lerden yararlanın: rotasyonu ve IP sağlık yönetimini proxy sağlayıcısına bırakarak kod karmaşıklığını azaltın.
- Header'ları IP'lerle senkronize edin: parmak izi çıkarılmasını önlemek için User-Agent'ları her zaman IP'lerle birlikte döndürün.
- Özel yeniden deneme mantığı kurun: spider'ınızın 403 ve 429 hatalarında anında yeni bir proxy oturumuna geçtiğinden emin olun.
Bu stratejileri uygulayarak kırılgan bir scraper'ı, modern web'deki en karmaşık anti-bot ortamlarında yol alabilen sağlam bir veri çıkarma motoruna dönüştürürsünüz.
Bunları da okuyun
A-Parser için Proxy'ler: Arama Motoru Parsing Kurulumu
Xrumer İçin Proxy'ler: Hangisini Seçmeli ve Nasıl Kurmalı
Key Collector için proxy'ler: kurulum ve rotasyon
Binom Tracker: Trafik arbitrajı için proxy kurulumu
VKDog Pro: VK içerik otomatik paylaşımı ve grabbing
