İçeriğe geç

Scrapy'de Proxy Yapılandırma: Engellenmeden Etkili Web Scraping

Инструменты
Scrapy'de Proxy Yapılandırma: Engellenmeden Etkili Web Scraping

Scrapy'de proxy yapılandırmak, istekleri benzersiz IP adreslerinden oluşan bir havuza dağıtarak IP tabanlı rate limiting ve anti-bot korumalarını aşmanın başlıca yöntemidir. Etkili bir uygulama, proxy kimlik bilgilerini her Request nesnesinin meta özniteliğine enjekte etmek için Scrapy'nin middleware mimarisini kullanır; böylece hedef sunucu trafiği tek bir crawler'dan değil, birbirinden farklı birçok kullanıcıdan geliyormuş gibi algılar.

Modern Web Scraping'de Proxy Neden Gerekli

Scrapy, yüksek performanslı crawling için tasarlanmış asenkron bir framework'tür, ancak varsayılan hızı modern anti-scraping sistemleri karşısında en büyük zayıflığıdır. Proxy katmanı olmadan bir Scrapy spider'ı tek bir IP adresinden dakikada kolayca yüzlerce istek yapabilir ve Cloudflare, Akamai veya DataDome gibi Web Application Firewall'ların (WAF) anında engel koymasını tetikler.

GProxy gibi bir sağlayıcıyla sağlam bir proxy stratejisi kurmak üç kritik işlevi yerine getirir:

  • IP Rotasyonu: Hedef sunucunun tek bir kaynaktan gelen istek örüntüsünü fark etmesini engeller.
  • Coğrafi Hedefleme: Trafiği belirli ülke veya şehirlerdeki çıkış düğümlerinden yönlendirerek spider'ın bölgeye özgü içeriğe erişmesini sağlar.
  • İstek Dağıtımı: Yükü dağıtarak daha yüksek eşzamanlılık sağlar; bu, milyonlarca URL içeren büyük ölçekli veri çıkarma projeleri için şarttır.

Kurumsal ölçekte scraping için ücretsiz veya herkese açık proxy'lere güvenmek başarısızlık reçetesidir. Bu IP'ler genellikle zaten kara listededir ve şifreleme sunmaz. GProxy'nin yüksek kaliteli residential proxy'leri, gerçek ISP tarafından atanmış adreslerin meşruiyetini sağlar ve Scrapy trafiğinizi organik kullanıcı davranışından ayırt edilemez hale getirir.

Scrapy'de Proxy Yapılandırma: Engellenmeden Etkili Web Scraping

Scrapy'de Temel Proxy Yapılandırması

Scrapy'de proxy kullanmanın en basit yolu, proxy URL'sini doğrudan bir scrapy.Request nesnesinin meta parametresine geçirmektir. Scrapy'nin yerleşik HttpProxyMiddleware bileşeni (varsayılan olarak etkindir) istek meta verisinde proxy anahtarını arar.


import scrapy

class SimpleProxySpider(scrapy.Spider):
    name = "proxy_spider"

    def start_requests(self):
        # Biçim: http://user:password@proxy_host:proxy_port
        proxy_url = "http://username:[email protected]:7000"
        urls = ["https://httpbin.org/ip"]
        
        for url in urls:
            yield scrapy.Request(
                url=url, 
                callback=self.parse,
                meta={'proxy': proxy_url}
            )

    def parse(self, response):
        self.logger.info(f"Response from IP: {response.text}")

Bu yöntem küçük scriptler için işe yarasa da, proxy dizesinin spider mantığı içinde elle yönetilmesini gerektirdiği için büyük ölçekli projelerde verimsizdir. Bu, spider'ın parsing mantığına odaklanması ve istek yönlendirmesinin altyapı tarafından üstlenilmesi gereken sorumlulukların ayrılması ilkesini ihlal eder.

Özel Middleware ile Proxy Rotasyonunu Otomatikleştirme

Etkili biçimde ölçeklenmek için proxy mantığını middlewares.py dosyasına taşıyın. Böylece spider'larınızı değiştirmeden her giden isteğe otomatik olarak bir proxy ekleyebilirsiniz. Bu özellikle, tek bir giriş noktasının rotasyonu backend tarafında hallettiği GProxy rotasyonlu residential endpoint'leri kullanırken faydalıdır.

Adım 1: Middleware Oluşturma

Scrapy projenizde middlewares.py dosyasını açın ve proxy atamasını yönetecek bir sınıf tanımlayın:


class GProxyMiddleware:
    def __init__(self, proxy_url):
        self.proxy_url = proxy_url

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            proxy_url=crawler.settings.get('GPROXY_URL')
        )

    def process_request(self, request, spider):
        # Proxy yalnızca daha önce ayarlanmamışsa atanır
        if 'proxy' not in request.meta:
            request.meta['proxy'] = self.proxy_url

Adım 2: settings.py Dosyasını Güncelleme

Karmaşık bir mantık kuruyorsanız özel middleware'inizi etkinleştirmeli ve varsayılan HttpProxyMiddleware bileşenini devre dışı bırakmalısınız; yine de genellikle özel middleware'iniz onunla birlikte çalışabilir. Erken çalışmasını garanti etmek için önceliği 750'nin (HttpProxyMiddleware varsayılanı) altına ayarlayın.


# settings.py

GPROXY_URL = "http://username:[email protected]:7000"

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.GProxyMiddleware': 400,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
}

Scrapy Spider'ları için Proxy Türlerinin Karşılaştırması

Proxy türü seçimi, scraping operasyonlarınızın başarı oranını ve maliyet verimliliğini önemli ölçüde etkiler. Aşağıdaki tablo, Scrapy ortamlarında kullanılan üç ana proxy kategorisini karşılaştırır.

Proxy Türü Anonimlik Düzeyi Hız Maliyet En İyi Kullanım Alanı
Veri merkezi Orta Çok Yüksek Düşük Temel güvenliğe sahip sitelerin yüksek hızlı scraping'i.
Statik Residential Yüksek Yüksek Orta Oturumları sürdürmek veya sosyal medya hesaplarını yönetmek.
Rotasyonlu Residential En Yüksek Orta düzey Yüksek Agresif anti-bot sistemlerini aşmak (Amazon, Google vb.).

Çoğu Scrapy kullanıcısı için Rotasyonlu Residential Proxy'ler altın standarttır. Her istek için milyonluk bir havuzdan yeni bir IP verirler; bu da hedef sunucunun IP örüntülerine bakarak tüm operasyonunuzu banlamasını istatistiksel olarak imkânsız kılar.

Scrapy'de Proxy Yapılandırma: Engellenmeden Etkili Web Scraping

Proxy Kimlik Doğrulaması ve Güvenliği

GProxy dahil çoğu premium proxy servisi kimlik doğrulama ister. Scrapy bunun için iki ana yöntemi destekler: URL İçinde Kimlik Doğrulama ve Proxy-Authorization Başlıkları.

URL İçinde Kimlik Doğrulama

Önceki örneklerde gösterilen yöntem budur: http://user:pass@host:port. Uygulaması kolaydır ancak şifreniz özel karakterler içeriyorsa sorun çıkarabilir. Şifrenizde @ veya : gibi semboller varsa bunları URL-encode etmeniz gerekir.

Başlık Tabanlı Kimlik Doğrulama

Özellikle karmaşık kimlik bilgileriyle çalışırken daha temiz bir yaklaşım için Proxy-Authorization başlığını kullanabilirsiniz. Bu, username:password dizenizi Base64 ile kodlamayı gerektirir.


import base64

class SecureProxyMiddleware:
    def process_request(self, request, spider):
        user_pass = "username:password"
        encoded_user_pass = base64.b64encode(user_pass.encode('utf-8')).decode('utf-8')
        request.meta['proxy'] = "http://gate.gproxy.com:7000"
        request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

İleri Düzey Stratejiler: Oturum Yönetimi ve Yeniden Denemeler

Giriş yapmayı veya çok adımlı bir ödeme akışını gerektiren siteleri scrape ederken her istekte IP'yi değiştirmek oturumu bozar. Bu durumlarda "sticky session" gerekir.

Sticky Session Uygulama

GProxy, kullanıcı adı dizenize bir oturum kimliği ekleyerek aynı IP'yi belirli bir süre korumanıza izin verir (örn. user-username-session-12345:password). Scrapy'de bunu, bir oturum kimliğini belirli bir spider örneğiyle veya belirli bir crawl segmentiyle ilişkilendirerek yönetebilirsiniz.

Proxy Hatalarını Yönetme

Hiçbir proxy havuzu %100 kararlı değildir. Bazı istekler kaçınılmaz olarak zaman aşımına uğrar veya 502/503 hatası döndürür. Bunları düzgün ele almak için Scrapy'nin retry middleware'ini yapılandırmalısınız. settings.py dosyanızda retry ayarlarını düzenleyerek, yalnızca belirli bir proxy düğümü başarısız oldu diye spider'ın bir URL'den vazgeçmemesini sağlayın.


RETRY_ENABLED = True
RETRY_TIMES = 5  # Proxy kararlılığı için yeniden deneme sayısını artırın
RETRY_HTTP_CODES = [500, 502, 503, 504, 408, 429]

Yeniden deneme gerçekleştiğinde, rotasyonlu bir proxy endpoint'i kullanıyorsanız bir sonraki deneme otomatik olarak farklı bir IP üzerinden gider ve sorun çoğu zaman anında çözülür.

Performans Optimizasyonu: Eşzamanlılık ve Gecikmeler

Yaygın bir hata, büyük bir proxy havuzu kullanırken Scrapy'nin varsayılan ayarlarını olduğu gibi bırakmaktır. Scrapy varsayılan olarak eşzamanlılığı 16 istekle sınırlar. GProxy'nin devasa residential havuzuna erişiminiz varsa, verimi artırmak için bu değeri güvenle yükseltebilirsiniz.

  • CONCURRENT_REQUESTS: CPU'nuza ve ağ bant genişliğinize bağlı olarak bunu 32, 64 hatta 128'e çıkarın.
  • DOWNLOAD_DELAY: Yüksek kaliteli residential proxy'ler kullanıyorsanız, IP rotasyonu "insan benzeri" tempoyu zaten sağladığı için DOWNLOAD_DELAY değerini genellikle 0'a veya çok küçük bir değere (örn. 0.2) düşürebilirsiniz.
  • AUTOTHROTTLE_ENABLED: Scrapy'nin tarama hızını proxy gecikmesine ve hedef sunucunun yanıt süresine göre dinamik olarak ayarlaması için bunu etkinleştirin.

# GProxy için settings.py optimizasyonu
CONCURRENT_REQUESTS = 100
CONCURRENT_REQUESTS_PER_DOMAIN = 50
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1
AUTOTHROTTLE_MAX_DELAY = 10

Proxy Trafiğini İzleme ve Hata Ayıklama

Proxy'lerinizin beklendiği gibi çalıştığından emin olmak için çıkış IP'sini düzenli olarak loglayın. Rotasyonun gerçekten gerçekleştiğini doğrulamak için bu hayati önemdedir. Hangi IP'lerin kullanıldığını ve bunların başarı oranlarını izlemek üzere basit bir Spider Signal veya LogFormatter oluşturabilirsiniz.

Yüksek oranda 403 (Forbidden) hatası görüyorsanız bu genellikle User-Agent'ınızın veya tarayıcı başlıklarınızın sunucunun beklediği fingerprint ile uyuşmadığını ya da proxy'lerinizin veri merkezi IP'si olarak tespit edildiğini gösterir. GProxy residential IP'lerine geçmek ve başlıkları IP'lerle birlikte döndürmek için scrapy-user-agents paketini kullanmak bunu genellikle çözer.

Önemli Çıkarımlar

Scrapy'de proxy yapılandırmak yalnızca engellerden kaçınmakla ilgili değildir; dayanıklı ve ölçeklenebilir bir veri çıkarma hattı kurmakla ilgilidir. Proxy mantığını middleware'lere taşıyarak ve yüksek kaliteli residential havuzlardan yararlanarak scraper'larınızın ömrünü belirgin şekilde uzatırsınız.

  • Middleware Kullanın: Proxy'leri asla spider'larınıza sabit kodlamayın; daha temiz ve bakımı kolay bir mimari için middlewares.py kullanın.
  • Residential IP'leri Önceliklendirin: En temel anti-bot korumasına sahip herhangi bir sitede bile GProxy residential proxy'leri, veri merkezi alternatiflerine kıyasla çok daha yüksek başarı oranı sunar.
  • Yeniden Denemeleri İnce Ayarlayın: Hatalar sırasında IP rotasyonundan tam olarak yararlanmak için RETRY_TIMES değerini en az 5 yapın ve 429 ile 503 hata kodlarını dahil edin.
  • Başlıkları IP'lerle Eşleştirin: Anında engellenmeye yol açan fingerprint uyuşmazlıklarını önlemek için User-Agent dizelerinizi her zaman proxy'lerinizle birlikte döndürün.
support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.