Bir Scrapy GET isteğini başka bir proxy üzerinden yeniden deneme
Scrapy'nin yeniden deneme yardımcısını kullanarak yeniden deneme bütçesine uyarak yeni bir proxy ile yeni bir istek planlayın.
response.request.meta değerini değiştirmek bir Python nesnesini değiştirir. Bir indirme daha yapmak için Scrapy'ye planlayacağı başka bir Request vermek gerekir.
Callback'inizin açıkça yeniden denemeye karar verdiği bir GET için Scrapy'nin genel yeniden deneme yardımcısı yeniden deneme sayımını yeni istekle birlikte tutabilir:
from scrapy.downloadermiddlewares.retry import get_retry_request
def retry_through(self, response, proxy_url):
retry = get_retry_request(
response.request,
spider=self,
reason='choose_another_proxy',
)
if retry is None:
return None
retry.meta['proxy'] = proxy_url
retry.headers.pop('Proxy-Authorization', None)
return retry
Bu bir spider yardımcısıdır. Çağıran, ortaya çıkan Request'i mevcut olduğunda döndürmeli veya yield etmelidir. None, yardımcının geçerli sınır dahilinde bir yeniden denemeyi reddettiği anlamına gelir.
Yeniden deneme yardımcısı isteği kopyalar, yeniden deneme sayacını günceller ve yeniden denemeye uygun zamanlayıcı davranışını sağlar. Aynı URL'yi sıradan yeni bir istek olarak yield etmek, bunun yerine yinelenen filtrelemeye takılabilir.
Etkin HttpProxyMiddleware tarafından desteklenen bir proxy URL'si kullanın. İzin verilen genel GET isteklerinin yeniden denemeleri için HTTP proxy listesinden kimliği doğrulanmamış bir HTTP adayı proxy_url sağlayabilir. Önceden eklenmiş bir proxy-authorization alanını temizlemek, eski bir aracının başlığının bu seçime taşınmasını önler; uygun olduğunda ara katmanın yeni hesabı yeni proxy URL'sinden türetmesine izin verin.
Bu callback düzeyindeki seçimi RetryMiddleware'in yapılandırılmış hatalarını otomatik işlemesinden ayrı tutun. Yeniden denemenin hangi katmana ait olduğuna karar verin ki işlem iki bağımsız bütçe tüketmesin. Örnek, yeniden oynatılabilir GET işiyle ilgilidir; keyfi olarak gönderilmiş bir işlemi yinelemenin güvenli olduğu vaadi değildir.