Změna response.request.meta mění objekt Pythonu. Pro další stahování je třeba dát Scrapy další Request k naplánování.

U GET, u kterého se váš callback výslovně rozhodne pro opakování, může veřejný pomocník pro opakování v Scrapy vést účetnictví opakování s novým požadavkem:

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

Toto je pomocník pavouka. Volající musí výsledný Request vrátit nebo yieldnout, když je k dispozici. None znamená, že pomocník odmítl další opakování v rámci platného limitu.

Pomocník pro opakování zkopíruje požadavek, aktualizuje jeho počet opakování a poskytne chování plánovače vhodné pro opakování. Pouhé yieldnutí stejné URL jako běžného nového požadavku může naopak narazit na filtrování duplicit.

Použijte URL proxy podporovanou povoleným HttpProxyMiddleware. Pro opakování povolených veřejných GET požadavků může neautentizovaný HTTP kandidát z seznamu HTTP proxy poskytnout proxy_url. Vymazání dříve připojeného pole proxy-authorization zabrání přenesení hlavičky starého prostředníka do tohoto výběru; nechte middleware odvodit nový účet z nové URL proxy, pokud je to relevantní.

Tuto volbu na úrovni callbacku držte oddělenou od automatického zpracování nakonfigurovaných selhání RetryMiddleware. Rozhodněte, která vrstva opakování vlastní, aby operace nespotřebovala dva nezávislé rozpočty. Příklad se týká opakovatelné GET práce, nikoli slibu, že opakování libovolné odeslané transakce je bezpečné.

Související články