Scrapy-GET-pyynnön uudelleenyritys toisen välityspalvelimen kautta
Käytä Scrapyn uudelleenyritysapuria uuden pyynnön ajoittamiseen uudella välityspalvelimella uudelleenyritysbudjettia noudattaen.
response.request.meta:n muuttaminen muuttaa Python-oliota. Toista latausta varten Scrapylle on annettava toinen Request ajastettavaksi.
GET-pyynnölle, jonka callback päättää nimenomaisesti yrittää uudelleen, Scrapyn julkinen uudelleenyritysapuri voi pitää uudelleenyrityslaskennan uuden pyynnön mukana:
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
Tämä on hämähäkkiaputoiminto. Kutsujan on palautettava tai yieldattava syntyvä Request, kun sellainen on saatavilla. None tarkoittaa, että apuri kieltäytyi vielä yhdestä uudelleenyrityksestä sovellettavan rajan puitteissa.
Uudelleenyritysapuri kopioi pyynnön, päivittää sen uudelleenyrityslaskurin ja tarjoaa uudelleenyritykseen sopivan ajoittajan toiminnan. Jos sama URL yieldataan tavallisena uutena pyyntönä, voi sen sijaan törmätä kopioiden suodatukseen.
Käytä välityspalvelimen URL-osoitetta, jota käytössä oleva HttpProxyMiddleware tukee. Sallittujen julkisten GET-pyyntöjen uudelleenyrityksiin autentikoimaton HTTP-ehdokas HTTP-välityspalvelinluettelosta voi tarjota proxy_url-arvon. Aiemmin liitetyn proxy-authorization-kentän tyhjentäminen estää vanhan välittäjän otsakkeen siirtymisen tähän valintaan; anna middlewaren johtaa uusi tili uudesta välityspalvelimen URL-osoitteesta, kun se on tarpeen.
Pidä tämä callback-tason valinta erillään RetryMiddlewaren automaattisesta määritettyjen virheiden käsittelystä. Päätä, mikä kerros omistaa uudelleenyrityksen, jotta toiminto ei kuluta kahta riippumatonta budjettia. Esimerkki koskee toistettavaa GET-työtä, ei lupausta siitä, että mielivaltaisen lähetetyn tapahtuman toistaminen olisi turvallista.