Sprememba response.request.meta spremeni objekt Python. Za novo prenašanje morate Scrapyju dati drug Request za načrtovanje.

Za GET, ki se ga vaš callback izrecno odloči ponoviti, lahko javni pomočnik za ponovni poskus Scrapyja vodi obračun poskusov z novo zahtevo:

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 je pomočnik pajka. Klicatelj mora vrniti ali yieldati nastali Request, ko je na voljo. None pomeni, da je pomočnik zavrnil še en poskus v okviru veljavne omejitve.

Pomočnik za ponovni poskus kopira zahtevo, posodobi števec poskusov in zagotovi vedenje razporejevalnika, primerno za ponovni poskus. Če preprosto yieldate isti URL kot običajno novo zahtevo, lahko namesto tega naletite na filtriranje dvojnikov.

Uporabite URL proxyja, ki ga podpira omogočeni HttpProxyMiddleware. Za ponovne poskuse dovoljenih javnih zahtev GET lahko neavtentificiran kandidat HTTP s seznama proxyjev HTTP zagotovi proxy_url. Čiščenje prej priloženega polja proxy-authorization prepreči prenos glave starega posrednika v to izbiro; pustite middleware, da izpelje nov račun iz novega URL proxyja, kadar je to ustrezno.

Ta izbira na ravni callbacka naj bo ločena od samodejnega obravnavanja konfiguriranih napak v RetryMiddleware. Odločite se, katera plast ima ponovni poskus, da operacija ne porabi dveh neodvisnih proračunov. Primer se nanaša na ponovljivo delo GET, ne na obljubo, da je ponavljanje poljubne oddane transakcije varno.

Sorodni članki