Scrapy’nin neden bir proxy’ye ihtiyacı var?
Scrapy için proxy’ler, aracın her zaman onu çalıştıran makinenin IP adresini kullanmak yerine farklı bir IP adresi üzerinden bağlanmasını sağlar. Bu, konum tabanlı görevler, testler, izleme ve bağlantı kaynağının önemli olduğu diğer işler için yararlıdır.
Scrapy yine de ana görevi yerine getirir. Proxy ise bağlantının nereden geldiğiyle ilgilenir.
Proxy olmadan ne olur: IP engellemeleri, hız sınırlamaları, coğrafi kısıtlamalar
Proxy olmadan, web siteleri sürekli aynı IP adresini görür. Etkinlik arttıkça, bu IP adresi bir hız sınırına ulaşabilir veya engellenebilir.
Konum da önemli olabilir. Almanya'dan açılan bir sayfa, ABD'den açılan bir sayfayla aynı içeriği göstermeyebilir.
Scrapy için bir proxy, gerektiğinde farklı IP adreslerinden ve konumlardan bağlanmayı mümkün kılar.
Scrapy ile hangi proxy türü kullanılmalı
Doğru proxy türü, işin niteliğine bağlıdır.
| Proxy türü | Veri toplama | Hesap yönetimi | Test | İzleme |
|---|
| Konut | Konum ve IP kaynağının önemli olduğu durumlarda uygundur | Hesaplar için konut IP'leri gerektiğinde kullanışlıdır | Konum tabanlı testler için uygundur | Farklı konumlardan gelen içeriği kontrol etmek için kullanışlıdır |
| İSS | Sabit bir IP gerektiğinde uygundur | Tek bir IP üzerinden uzun süreli oturumlar için kullanışlıdır | Tutarlı bir IP ile test yapmak için uygundur | Aynı IP'den sürekli kontroller yapmak için kullanışlıdır |
| Veri merkezi | Hız ve yüksek istek hacimleri için uygundur | Ev tipi IP'lere ihtiyaç duyulmadığında daha iyidir | Genel testler için uygundur | Sık otomatik kontroller için uygundur |
Konut proxy'leri, IP kaynağı ve konumun önemli olduğu durumlarda kullanışlıdır. İSS proxy'leri, aynı IP'nin daha uzun süre aktif kalması gerektiğinde iyi sonuç verir. Veri merkezi proxy'leri ise odak noktasının hız ve ölçek olduğu durumlarda mantıklıdır.
En iyi seçenek, görevin coğrafi hedefleme, istikrarlı bir bağlantı veya daha geniş bir IP havuzuna erişim gerektirip gerektirmediğine de bağlıdır.
Scrapy'de proxy nasıl bağlanır
Scrapy proxy kurulumunda Geonode adresindeki sunucu, bağlantı noktası, kullanıcı adı ve şifre gereklidir. Kimlik bilgilerini ortam değişkenlerinde saklayın, ardından kodda proxy'yi kurarken bunları yükleyin.
Geonode kullanıyor musunuz? Kullanıcı adını ve şifreyi Erişim Kimlik Bilgileri bölümünden, ana bilgisayarı, bağlantı noktasını ve protokolü ise Proxy Sunucu Bilgileri bölümünden alın.
Ayar yolu veya kod
Testimiz için bir indirme aracı ara yazılımı ekledik:
DOWNLOADER_MIDDLEWARES = {
"geonode_scrapy.middlewares.GeonodeProxyMiddleware": 350,
"scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 400,
}
Bu ara yazılım, proxy URL'sini request.meta["proxy"]
adresinden geçirir; Scrapy'nin HttpProxyMiddleware
adresi de bunu kullanır:
request.meta["proxy"] = proxy_url
Proxy'yi tek bir isteğe doğrudan da aktarabilirsiniz:
yield scrapy.Request(
url,
meta={"proxy": proxy_url},
)
Gerçek kullanıcı adını ve şifreyi Python dosyasına doğrudan yazmak yerine ortam değişkenlerinde saklayın. Bu kurulum, testimiz sırasında proxy üzerinden HTTP 200 yanıtını başarıyla döndürdü.
Kimlik doğrulama biçimi host:port:user:pass
Geonode
size dört değer verir:
proxy.geonode.io:PORT:USERNAME:PASSWORD
Scrapy, bir proxy URL’siyle aynı bilgilere ihtiyaç duyar:
http://USERNAME:PASSWORD@proxy.geonode.io:PORT
Kimlik bilgilerini veya tam proxy değerini bir ortam değişkeninde saklayın:
GEONODE_PROXY_URL=http://USERNAME:PASSWORD@proxy.geonode.io:PORT
Ardından bunu Python’da yükleyin:
import os
proxy_url = os.environ["GEONODE_PROXY_URL"]
HTTP testimiz için ortaya çıkan biçim şuydu:
http://USERNAME:PASSWORD@proxy.geonode.io:9000
Kimlik doğrulamayı kontrol etmek için, isteği yanlış kimlik bilgileriyle de çalıştırdık. Scrapy, şu yanıtla birlikte HTTP 407 hatası aldı:
Authentication error. Please check your authentication settings.
Scrapy, yanıtı HttpErrorMiddleware
üzerinden HttpError('Ignoring non-200 response')
olarak görüntüledi.
Scrapy’de Rotasyon ve Sabit Oturum Karşılaştırması
İsteklerin aynı IP adresini koruması gerekmiyorsa, rotasyon kullanın.
Testimiz için, dönen Geonode
proxy’sini Scrapy’ye aktardık:
proxy_url = "http://USERNAME:PASSWORD@proxy.geonode.io:9000"
yield scrapy.Request(
url,
meta={"proxy": proxy_url},
)
Arka arkaya beş istek gönderdik:
Request 1: 101.98.231.191
Request 2: 101.98.231.191
Request 3: 101.98.231.191
Request 4: 122.164.83.189
Request 5: 122.164.83.189
Unique IPs: 2
Rotation: Yes
Test, rotasyonun gerçekleştiğini doğruladı, ancak IP adresi her istekte değişmedi.
İlgili isteklerin aynı IP adresinde kalması gerekiyorsa, bunun yerine sabit oturum kullanın:
proxy_url = (
"http://USERNAME-session-blogtest01-lifetime-10:"
"PASSWORD@proxy.geonode.io:10000"
)
Aynı oturumu kullanarak üç istek gönderdik:
Request 1: 177.73.202.78
Request 2: 177.73.202.78
Request 3: 177.73.202.78
Same IP: Yes
Testimizde üç istek de aynı IP adresini kullandı.
Kullanılabilir ayarlar için dönüşümlü proxy'ler ve sabit oturumlar hakkındaki Geonode
kılavuzlarına bakın.
Scrapy'de sık karşılaşılan proxy hataları ve bunların çözümleri
Proxy çalışmıyorsa, öncelikle bağlantı bilgilerini kontrol edin. Kullanıcı adını ve şifreyi, ardından ana bilgisayarı, bağlantı noktasını ve protokolü kontrol edin. Scrapy tarafından döndürülen hata mesajı genellikle sorunun kaynağını belirlemenize yardımcı olabilir.
407 Proxy Kimlik Doğrulaması Gerekiyor
407 hatası genellikle bir kimlik doğrulama sorununa işaret eder.
Scrapy'yi yanlış kimlik bilgileriyle test ettiğimizde, proxy şu yanıtı verdi:
HTTP status: 407
Authentication error. Please check your authentication settings.
Öncelikle kullanıcı adını ve şifreyi kontrol edin. Bunlar doğruysa, Scrapy'nin şema, kimlik bilgileri, ana bilgisayar ve bağlantı noktası dahil olmak üzere tam proxy URL'sini aldığından emin olun.
ERR_TUNNEL_CONNECTION_FAILED / bağlantı reddedildi
Bir bağlantı hatası genellikle Scrapy’nin proxy’ye ulaşamadığı anlamına gelir.
Öncelikle ana bilgisayar adresini ve bağlantı noktasını kontrol edin. Ardından protokolün kullanılan proxy sunucusuyla uyumlu olduğundan emin olun.
Scrapy, her zaman tarayıcı tarzı ERR_TUNNEL_CONNECTION_FAILED yanıtını döndürmez. Başarısız bağlantı testimizde, Scrapy isteği yeniden denedi ve sonunda Twisted ConnectionLost hatasını içeren DownloadFailedError yanıtını döndürdü.
Zaman Aşımları ve Boş Yanıtlar
Zaman aşımı, isteğin ayarlanan süre içinde bir yanıt almamış olduğu anlamına gelir.
Öncelikle, hedef URL’nin çalışıp çalışmadığını ve proxy’nin bağlanıp bağlanamadığını kontrol edin. Her ikisi de çalışıyorsa, Scrapy’deki zaman aşımı ayarlarını kontrol edin.
Bağlantı hatası testimiz için, DOWNLOAD_TIMEOUT=5
adresinde geçersiz bir proxy bağlantı noktası kullandık. Yeniden denemelerin ardından Scrapy şu yanıtı verdi:
DownloadFailedError(
ConnectionLost:
Connection to the other side was lost in a non-clean fashion.
)
Dolayısıyla, başarısız bir proxy bağlantısı, basit bir zaman aşımı mesajı yerine bir bağlantı hatası olarak görünebilir.
Scrapy’ye özgü bir hata
Scrapy’ye özgü, kolayca yapılabilecek bir hata, request.meta["proxy"]
adresine eksik bir değer aktarmaktır.
Testimizde, şema veya kimlik bilgileri olmadan
proxy.geonode.io:9000
adresini kullandık. İstek, HTTP 407 hatası döndürdü.
Bunu düzeltmek için tam proxy URL'sini aktarmak gerekti:
http://USERNAME:PASSWORD@proxy.geonode.io:9000
ya da indirici ara yazılımının bunu ortam değişkenlerinden oluşturmasına izin vermek.
Scrapy + Geonode: Ne elde edersiniz?
Scrapy, uygulamadaki istekleri veya bağlantıları yönetir. Geonode ise proxy bağlantısını yönetir.
İşe göre ev, ISP veya veri merkezi proxy'leri seçebilir, ardından gerektiğinde rotasyon, sabit oturumlar ve coğrafi hedefleme özelliklerini kullanabilirsiniz. Bu sayede proxy kurulumu, uygulama kodunun geri kalanından ayrı tutulur.
Planlar proxy türüne göre değişir; bazı seçeneklerin fiyatı GB başına belirlenir.
Scrapy, SOCKS5 proxy'lerini destekliyor mu?
Test ettiğimiz Scrapy sürümünde SOCKS5 için ek bir kurulum gerekiyor.
socks5:// proxy'sini Scrapy'nin varsayılan HTTP işleyicisi üzerinden geçirme denemesi şu hatayla sonuçlandı:
UnsupportedURLSchemeError("Unsupported scheme: b'socks5'")
Ardından httpx2[socks] adresini yükledik ve Scrapy’nin deneysel HttpxDownloadHandler ayarını yapılandırdık. 11000 numaralı bağlantı noktasında SOCKS5 dönen proxy kullanıldığında, istek HTTP 200 statüsüyle başarılı oldu ve bir proxy IP’si döndü. Bu işleyici deneysel nitelikte olduğundan, üretim ortamında kullanılması tavsiye edilmez; daha çok test amaçlı kullanıma uygundur.
Scrapy'de istek başına IP adreslerini dönüşümlü olarak kullanabilir miyim?
Evet, Scrapy istekleri dönüşümlü bir proxy üzerinden gönderebilir, ancak her istek için farklı bir IP adresi garanti edilmez.
Beş istekten oluşan testimizde iki farklı IP adresi elde ettik. İlk üç istek tek bir IP adresini paylaşırken, son iki istek başka bir IP adresini paylaştı; bu da test sırasında rotasyonun gerçekleştiğini doğruladı.
Ücretsiz deneme sürümü var mı?
Evet. Geonode ücretsiz bir deneme sürümü sunuyor; böylece ücretli bir plana geçmeden önce proxy, Scrapy ile test edilebilir. Güncel ücretsiz deneme sürümünü ve planları inceleyin.
Scrapy'de proxy ayarlarını nerede yapmalıyım?
Tek bir istek için, proxy ayarlarını request.meta["proxy"] aracılığıyla aktarın.
Aynı proxy ayarının birçok istekte kullanılması gerekiyorsa, downloader ara yazılımı proxy mantığını tek bir yerde tutar. Yaptığımız testte, özel ara yazılım, Scrapy'nin yerleşik HttpProxyMiddleware işlevi isteği işlemeden önce request.meta["proxy"] ayarını belirlemiştir.
Scrapy örümceğim neden çalışıyor ama 0 istek gönderiyor?
Örümceğin ilk isteklerini nasıl oluşturduğunu kontrol edin.
Scrapy 2.19 testimizde, yalnızca eski start_requests()
yöntemini tanımlamak, örümceğin sıfır istekle açılıp kapanmasına neden oldu. Asenkron start()
yöntemini kullanmak bu sorunu çözdü:
async def start(self):
yield scrapy.Request(...)
Bu, test ettiğimiz kurulum sırasında kaydedilen davranıştı.