Scrapy Framework’ünde Proxy Kullanımı
2 viewsScrapy ile Proxy Kullanımı
Scrapy, Python tabanlı güçlü bir web scraping framework’üdür. Büyük ölçekli scraping projelerinde proxy kullanımı neredeyse zorunludur. Scrapy’de proxy’yi en doğru ve esnek şekilde kullanmak için middleware yazmak veya mevcut middleware’leri yapılandırmak gerekir.
Bu makalede Scrapy’de proxy kullanımını detaylı olarak anlatacağız.
1. Temel Proxy Kullanımı (HttpProxyMiddleware)
Scrapy varsayılan olarak HttpProxyMiddleware middleware’ini sunar. En basit kullanım şu şekildedir:
settings.py dosyasına ekleyin:
Python
DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110, } # Proxy listesi PROXY_LIST = [ 'http://proxy_ip1:proxy_port', 'http://proxy_ip2:proxy_port', 'http://kullanici:sifre@proxy_ip3:proxy_port', ]
2. Özel Proxy Middleware Yazma (Önerilen Yöntem)
Daha esnek ve profesyonel bir çözüm için kendi middleware’inizi yazmanızı öneririz.
middlewares.py dosyası oluşturun:
Python
import random from scrapy import signals class ProxyMiddleware: def __init__(self, proxy_list): self.proxy_list = proxy_list @classmethod def from_crawler(cls, crawler): return cls( proxy_list=crawler.settings.get('PROXY_LIST') ) def process_request(self, request, spider): proxy = random.choice(self.proxy_list) request.meta['proxy'] = proxy spider.logger.info(f"Using proxy: {proxy}")
settings.py dosyasına ekleyin:
Python
DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.ProxyMiddleware': 350, 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400, } PROXY_LIST = [ 'http://185.XX.XX.XX:8080', 'http://kullanici:[email protected]:3128', 'socks5://proxy_ip:1080', ]
3. Proxy Rotasyonu ile Kullanım
Yukarıdaki middleware zaten rastgele proxy seçimi yapmaktadır. Daha gelişmiş rotasyon için şu yöntemleri kullanabilirsiniz:
- Her istekte farklı proxy
- Domain bazlı proxy atama
- Hata durumunda proxy değiştirme
4. Hata Durumunda Proxy Değiştirme
Middleware’e hata yönetimi ekleyebilirsiniz:
Python
def process_exception(self, request, exception, spider): proxy = request.meta.get('proxy') spider.logger.warning(f"Proxy {proxy} failed. Changing proxy...") # Yeni proxy ata request.meta['proxy'] = random.choice(self.proxy_list) return request
5. Tam Örnek settings.py Yapılandırması
Python
BOT_NAME = 'myproject' SPIDER_MODULES = ['myproject.spiders'] NEWSPIDER_MODULE = 'myproject.spiders' # Proxy Middleware DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.ProxyMiddleware': 350, } PROXY_LIST = [ 'http://proxy1:8080', 'http://kullanici:sifre@proxy2:3128', 'socks5://proxy3:1080', ] # User-Agent Rotasyonu (önerilir) USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' # Otomatik throttle AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_START_DELAY = 1 AUTOTHROTTLE_MAX_DELAY = 10
6. En İyi Uygulamalar
| Uygulama | Açıklama |
|---|---|
| Proxy rotasyonu | Her istekte farklı proxy kullanın |
| User-Agent rotasyonu | Bot tespitini azaltır |
| Hata yönetimi | Proxy hatasında otomatik değiştirme |
| Rate limiting | AUTOTHROTTLE veya DOWNLOAD_DELAY kullanın |
| Logging | Hangi proxy’nin kullanıldığını loglayın |
| Residential / Mobile Proxy | Yüksek güvenlikli siteler için tercih edin |
7. Sık Karşılaşılan Sorunlar
| Sorun | Çözüm |
|---|---|
| Tüm istekler aynı proxy’den gidiyor | Middleware’in aktif olduğundan emin olun |
| Proxy hatası alınıyor | Hata yönetimini middleware’e ekleyin |
| SOCKS5 proxy çalışmıyor | PySocks kütüphanesini yükleyin |
| Çok fazla ban yiyorsunuz | Residential/Mobile proxy + User-Agent rotasyonu kullanın |
Sonuç
Scrapy’de proxy kullanımı en sağlıklı şekilde özel middleware yazarak yapılır. Bu yöntem hem esnektir hem de proxy rotasyonu, hata yönetimi gibi ileri düzey özellikleri kolayca eklemenizi sağlar.
Profesyonel scraping projelerinde proxy + User-Agent + Rate Limiting kombinasyonu neredeyse zorunludur.
Bir sonraki makalemizde Web Scraping İçin Proxy ve User-Agent Yönetimi konusunu detaylı olarak inceleyeceğiz.