Scrapy-Splash'e proxy entegre etmek, Splash render servisinden çıkan isteklerin bir ara sunucu üzerinden yönlendirilmesini sağlar; böylece JavaScript ile render edilen web sayfaları için IP rotasyonu, coğrafi engel aşımı ve anonimlik mümkün olur.
Scrapy-Splash ile Proxy Entegrasyonunu Anlamak
Scrapy-Splash, Scrapy'nin scraping çatısını Splash'in headless tarayıcı render yetenekleriyle birleştirir. Bu kurulumda bir proxy yapılandırıldığında, Splash içindeki tarayıcı örneğinin yaptığı web istekleri belirtilen proxy sunucusuna yönlendirilir. Bu; ilk sayfa yüklemesi, sonraki AJAX istekleri ve sayfadaki JavaScript'in başlattığı diğer tüm ağ etkinlikleri için geçerlidir.
Scrapy-Splash ile Neden Proxy Kullanılır?
Dinamik içerik kazırken proxy'ler birkaç kritik işlev görür:
* IP tabanlı hız sınırlarını ve engelleri aşma: siteler erişimi çoğu zaman kaynak IP adresine göre kısıtlar. Proxy'ler istekleri birden çok IP'ye dağıtarak bu kısıtları hafifletir.
* Coğrafi kısıtlı içeriğe erişme: belirli coğrafi bölgelerdeki proxy'ler, scraper'ın fiziksel konumunda erişilemeyen içeriğe ulaşabilir.
* Anonimliği koruma: proxy'ler scraper'ın gerçek IP adresini gizleyerek operasyonel güvenliği artırır.
* Yükü dağıtma: büyük ölçekli işlerde proxy'ler ağ yükünü dağıtmaya ve tek bir IP'nin aşırı yüklenme ya da işaretlenme olasılığını azaltmaya yardımcı olur.
Scrapy-Splash Proxy İsteklerini Nasıl İşler
- Scrapy, Splash daemon'una bir
SplashRequestgönderir. - Splash isteği alır ve
proxyargümanı varsa, dahili tarayıcı örneğini (örneğin Chromium) tüm ağ trafiğini o proxy üzerinden geçirecek şekilde yapılandırır. - Tarayıcı örneği hedef URL'ye gider, JavaScript'i render eder ve gerekli ağ çağrılarını (örneğin XHR'ler, varlıkların indirilmesi) yapılandırılan proxy üzerinden yapar.
- Splash, tam olarak render edilmiş HTML'i, ekran görüntüsünü veya istenen diğer verileri Scrapy'ye geri döndürür.
Scrapy-Splash'te Proxy Yapılandırma
Proxy entegrasyonunun temel yöntemi SplashRequest içindeki proxy argümanıdır.
Temel Proxy Yapılandırması
Belirli bir istek için proxy kullanmak üzere proxy argümanını SplashRequest'in args sözlüğü içinde geçirin. Proxy URL biçimi [protocol://][user:password@]host:port şeklindedir.
import scrapy
from scrapy_splash import SplashRequest
class BasicProxySpider(scrapy.Spider):
name = 'basic_proxy_spider'
start_urls = ['http://quotes.toscrape.com/js/']
def start_requests(self):
# Temel bir HTTP proxy kullanım örneği
# Gerçek proxy IP'niz ve portunuzla değiştirin
yield SplashRequest(
url=self.start_urls[0],
callback=self.parse,
args={
'wait': 0.5,
'proxy': 'http://your_proxy_ip:port'
}
)
def parse(self, response):
title = response.css('title::text').get()
yield {
'title': title,
'url': response.url,
'proxy_used': response.request.meta.get('splash', {}).get('args', {}).get('proxy')
}
Kimlik Doğrulamalı Proxy'ler
Kimlik doğrulaması gerektiren proxy'lerde kullanıcı adı ve parolayı doğrudan proxy URL dizesine gömün.
import scrapy
from scrapy_splash import SplashRequest
class AuthenticatedProxySpider(scrapy.Spider):
name = 'auth_proxy_spider'
start_urls = ['http://quotes.toscrape.com/js/']
def start_requests(self):
# Gerçek proxy bilgilerinizle değiştirin
proxy_user = 'your_username'
proxy_pass = 'your_password'
proxy_host = 'your_proxy_ip'
proxy_port = 'port'
authenticated_proxy_url = f'http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}'
yield SplashRequest(
url=self.start_urls[0],
callback=self.parse,
args={
'wait': 0.5,
'proxy': authenticated_proxy_url
}
)
def parse(self, response):
title = response.css('title::text').get()
yield {
'title': title,
'url': response.url,
'proxy_used': response.request.meta.get('splash', {}).get('args', {}).get('proxy')
}
Dinamik Proxy Seçimi ve Rotasyon
Her istekte farklı proxy ya da bir rotasyon şeması gereken durumlarda, spider içinde bir proxy listesi tutun ve dinamik olarak birini seçin.
import scrapy
from scrapy_splash import SplashRequest
import random
class RotatingProxySpider(scrapy.Spider):
name = 'rotating_proxy_spider'
start_urls = ['http://quotes.toscrape.com/js/', 'http://toscrape.com/']
# Bir proxy listesi tanımlayın (gerçek proxy'lerinizle değiştirin)
# Kimlik doğrulamalı proxy'leri 'http://user:pass@host:port' olarak ekleyin
proxy_list = [
'http://proxy1_ip:port1',
'http://user:pass@proxy2_ip:port2',
'http://proxy3_ip:port3',
]
def start_requests(self):
for url in self.start_urls:
selected_proxy = random.choice(self.proxy_list)
yield SplashRequest(
url=url,
callback=self.parse,
args={
'wait': 0.5,
'proxy': selected_proxy
},
# Hangi proxy'nin kullanıldığını izlemek için özel meta da geçebilirsiniz
meta={'proxy_selected': selected_proxy}
)
def parse(self, response):
title = response.css('title::text').get()
yield {
'title': title,
'url': response.url,
'proxy_used': response.request.meta.get('proxy_selected') # Özel meta'ya erişim
}
Genel Proxy Yapılandırması (Splash Daemon)
Splash, tüm giden istekleri için varsayılan bir proxy kullanacak şekilde yapılandırılabilir. Bu genellikle Splash daemon'unu başlatmadan önce HTTP_PROXY ve HTTPS_PROXY ortam değişkenlerini ayarlayarak yapılır. Genel bir varsayılan sağlasa da, dinamik scraping görevlerinde istek başına proxy belirtmeye kıyasla daha az kontrol sunar.
Proxy Türleri ve Etkileri
Proxy türü seçimi anonimliği, performansı ve tespit edilme riskini etkiler.
| Özellik | Veri merkezi proxy'leri | Residential proxy'ler |
|---|---|---|
| IP kaynağı | Ticari veri merkezleri | Gerçek residential ISP'ler |
| Anonimlik | Orta (IP'ler genellikle bilinen alt ağlara aittir) | Yüksek (IP'ler sıradan tüketici kullanıcı gibi görünür) |
| Hız | Adanmış altyapı sayesinde genellikle daha hızlı | Residential ağlar üzerinden geçtiği için daha yavaş olabilir |
| Maliyet | IP başına daha düşük | IP veya bant genişliği başına daha yüksek |
| Tespit | Gelişmiş antibot sistemlerince tespit ve engellenmeye daha açık | Tespit edilmesi daha zor; engellenmesi daha güç |
| Kullanım alanları | Genel scraping, daha az korunan sitelerde yüksek hacimli işler | Çok hassas scraping, gelişmiş antibot sistemlerini aşma |
Proxy Protokolleri
- HTTP/HTTPS proxy'ler: standart web trafiğini taşır. Splash her iki protokolü de tam olarak destekler.
- SOCKS proxy'ler: SOCKS (SOCKS4, SOCKS5) proxy'ler daha alt seviyede çalışır ve yalnızca HTTP/HTTPS değil, çeşitli ağ protokollerini taşıyabilir. Splash ile SOCKS proxy kullanmak için protokolü
proxyURL'sinde belirtin (örneğinsocks5://user:pass@host:port).
Sticky ve Rotasyonlu Proxy'ler
- Sticky proxy'ler: aynı IP adresini belirli bir süre (örneğin birkaç dakikadan saatlere kadar) veya oturum boyunca korur. Tutarlı IP adresi isteyen hedef sitelerde oturum durumunu sürdürmek için kullanışlıdır.
- Rotasyonlu proxy'ler: her istekte ya da düzenli kısa aralıklarla yeni bir IP adresi atar. Kaynak IP'yi sık değiştirerek IP yasaklarından kaçınmanın kritik olduğu yüksek hacimli scraping için idealdir.
Sorun Giderme ve İyi Uygulamalar
Proxy Bağlantısını Doğrulayın
Büyük ölçekli devreye almadan önce proxy'nizi bağımsız olarak test edin. Basit bir curl komutu ya da Python requests betiği proxy'nin çalıştığını ve erişilebilirliğini doğrular.
curl --proxy http://your_proxy_ip:port http://httpbin.org/ip
Splash Loglarını Kontrol Edin
Splash içindeki proxy bağlantısı veya kimlik doğrulamasıyla ilgili sorunlar genellikle Splash daemon'u tarafından loglanır. Hata ayıklarken Splash'in konsol çıktısını veya log dosyalarını inceleyin.
Proxy Hatalarını Düzgün Yönetin
Başarısız istekleri karşılamak için yeniden deneme mekanizmaları veya proxy rotasyon mantığı uygulayın. Bir proxy sürekli başarısız oluyorsa onu aktif havuzdan çıkarın ya da bir süreliğine sağlıksız olarak işaretleyin. Scrapy'nin retry middleware'i uyarlanabilir, ancak proxy'ye özgü hata yönetimi çoğu zaman spider içinde özel mantık gerektirir.
Performans Değerlendirmeleri
Proxy'ler ek bir ağ atlaması getirir ve gecikmeyi artırır.
* Proxy havuzu yönetimi: proxy sağlığını, yanıt sürelerini ve kullanımı izleyen bir sistem kurun. Daha hızlı ve güvenilir proxy'lere öncelik verin.
* Kaynak kullanımı: Splash'in kendisi kaynak yoğundur. Proxy kullanımı ek yük getirir. Splash daemon'unun bu birleşik yükü kaldıracak yeterli CPU ve RAM'e sahip olduğundan emin olun.
Siteye Özgü Antibot Önlemleri
Gelişmiş antibot sistemleri, basit IP adreslerinin ötesindeki kalıpları tespit eder. Residential proxy kullansanız bile siteler otomatik gezinmeyi fark edebilir. Bu önlemlere karşı user-agent, viewport, browser_params gibi Splash argümanlarını ince ayarlayın ve daha insana benzer etkileşimler için özel Lua betikleri kullanın.
IP Sızıntısı
Proxy'nin scraper'ın gerçek IP'sini gerçekten gizlediğini doğrulayın. Görünen IP adresini kontrol etmek için Splash içinde http://httpbin.org/ip veya https://ipleak.net/ gibi servisleri kullanın.
# Splash içinde görünen IP'yi kontrol eden Lua betiği
lua_script = """
function main(splash)
splash:set_proxy_auto() -- 'proxy' argümanı ayarlandıysa proxy'nin kullanılmasını sağlar
splash:go("http://httpbin.org/ip")
splash:wait(0.5)
return splash:html()
end
"""
# Lua betiğini kullanan örnek SplashRequest
yield SplashRequest(
url="about:blank", # Gezinmeyi Lua yönettiği için buradaki URL önemli değil
callback=self.parse_ip_check,
endpoint='execute',
args={
'lua_source': lua_script,
'proxy': 'http://your_proxy_ip:port',
'timeout': 90 # Lua betikleri için timeout değerini artırın
}
)
def parse_ip_check(self, response):
# IP'yi çıkarmak için httpbin.org/ip HTML yanıtını ayrıştır
ip_address = response.css('pre::text').get() # httpbin değişirse seçiciyi güncelleyin
self.logger.info(f"Visible IP from Splash via proxy: {ip_address}")
# Sonraki işlemler...
