Scrapy GET sorğusunu başqa proxy vasitəsilə təkrar edin
Təkrar cəhd büdcəsinə riayət edərək yeni proxy ilə yeni sorğu planlaşdırmaq üçün Scrapy-nin təkrar cəhd köməkçisindən istifadə edin.
response.request.meta-nı dəyişmək Python obyektini dəyişir. Başqa yükləmə üçün Scrapy-yə planlaşdırmaq üçün başqa Request vermək lazımdır.
Callback-inizin açıq şəkildə təkrar etməyə qərar verdiyi GET üçün Scrapy-nin ictimai təkrar cəhd köməkçisi təkrar hesabını yeni sorğu ilə birlikdə saxlaya bilər:
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, hörümçək köməkçisidir. Çağıran tərəf nəticədə yaranan Request-i mövcud olduqda qaytarmalı və ya yield etməlidir. None köməkçinin tətbiq olunan limit daxilində başqa təkrar cəhddən imtina etdiyini bildirir.
Təkrar cəhd köməkçisi sorğunu kopyalayır, təkrar sayını yeniləyir və təkrar cəhd üçün uyğun planlaşdırıcı davranışını təmin edir. Eyni URL-i adi yeni sorğu kimi yield etmək əvəzinə dublikat filtrləmə ilə qarşılaşa bilər.
Aktiv HttpProxyMiddleware-in dəstəklədiyi proxy URL-indən istifadə edin. İcazə verilən ictimai GET sorğularının təkrarı üçün HTTP proxy siyahısından autentifikasiyasız HTTP namizədi proxy_url təmin edə bilər. Əvvəllər əlavə edilmiş proxy-authorization sahəsini təmizləmək köhnə vasitəçinin başlığının bu seçimə keçməsinin qarşısını alır; tətbiq olunduqda middleware yeni hesabı yeni proxy URL-dən çıxarsın.
Bu callback səviyyəli seçimi RetryMiddleware-in konfiqurasiya edilmiş uğursuzluqlarını avtomatik idarə etməsindən ayrı saxlayın. Təkrar cəhdin hansı qatla idarə olunduğunu qərar verin ki, əməliyyat iki müstəqil büdcə sərf etməsin. Nümunə təkrar oynadıla bilən GET işinə aiddir, ixtiyari göndərilmiş əməliyyatın təkrarlanmasının təhlükəsiz olması vədi deyil.