Zmiana response.request.meta zmienia obiekt Pythona. Aby wykonać kolejne pobranie, trzeba dać Scrapy inny Request do zaplanowania.

Dla GET, który twoja funkcja zwrotna wyraźnie postanawia ponowić, publiczny pomocnik ponawiania Scrapy może zachować rozliczanie ponowień przy nowym żądaniu:

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

To pomocnik pająka. Wywołujący musi zwrócić lub yieldować wynikowy Request, gdy jest dostępny. None oznacza, że pomocnik odmówił kolejnego ponowienia w obowiązującym limicie.

Pomocnik ponawiania kopiuje żądanie, aktualizuje licznik ponowień i zapewnia zachowanie planisty odpowiednie dla ponowienia. Samo yieldowanie tego samego URL jako zwykłego nowego żądania może zamiast tego trafić na filtrowanie duplikatów.

Użyj adresu URL proxy obsługiwanego przez włączony HttpProxyMiddleware. Do ponowień dozwolonych publicznych żądań GET nieuwierzytelniony kandydat HTTP z listy proxy HTTP może dostarczyć proxy_url. Wyczyszczenie wcześniej dołączonego pola proxy-authorization zapobiega przeniesieniu nagłówka starego pośrednika do tego wyboru; pozwól middleware wyprowadzić nowe konto z nowego URL proxy, gdy ma to zastosowanie.

Trzymaj ten wybór na poziomie funkcji zwrotnej osobno od automatycznej obsługi skonfigurowanych awarii przez RetryMiddleware. Zdecyduj, która warstwa odpowiada za ponowienie, aby operacja nie zużywała dwóch niezależnych budżetów. Przykład dotyczy powtarzalnej pracy GET, a nie obietnicy, że powtórzenie dowolnej wysłanej transakcji jest bezpieczne.

Powiązane artykuły