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.

Əlaqəli məqalələr