Zmena response.request.meta mení objekt Pythonu. Na ďalšie stiahnutie treba Scrapy dať iný Request na naplánovanie.

Pre GET, ktorý váš callback výslovne rozhodne zopakovať, môže verejný pomocník opakovania Scrapy viesť účtovníctvo opakovaní s novou požiadavkou:

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 pavúka. Volajúci musí vrátiť alebo yieldnúť výsledný Request, keď je dostupný. None znamená, že pomocník odmietol ďalšie opakovanie v rámci platného limitu.

Pomocník opakovania skopíruje požiadavku, aktualizuje jej počet opakovaní a poskytne správanie plánovača vhodné na opakovanie. Ak len yieldnete rovnakú URL ako bežnú novú požiadavku, môžete namiesto toho naraziť na filtrovanie duplikátov.

Použite URL proxy podporovanú povoleným HttpProxyMiddleware. Na opakovanie povolených verejných GET požiadaviek môže neautentizovaný HTTP kandidát zo zoznamu HTTP proxy poskytnúť proxy_url. Vymazanie predtým pripojeného poľa proxy-authorization zabráni preneseniu hlavičky starého sprostredkovateľa do tohto výberu; nechajte middleware odvodiť nový účet z novej URL proxy, ak je to relevantné.

Držte tento výber na úrovni callbacku oddelene od automatického spracovania nakonfigurovaných zlyhaní RetryMiddleware. Rozhodnite, ktorá vrstva vlastní opakovanie, aby operácia nespotrebovala dva nezávislé rozpočty. Príklad sa týka opakovateľnej práce GET, nie prísľubu, že opakovanie ľubovoľnej odoslanej transakcie je bezpečné.

Súvisiace články