Ponovite Scrapy GET kroz drugi proxy
Koristite Scrapyjev pomoćnik za ponovni pokušaj da zakažete novi zahtjev s novim proxyjem, poštujući budžet ponovnih pokušaja.
Promjena response.request.meta mijenja Python objekt. Da biste obavili još jedno preuzimanje, Scrapyju morate dati drugi Request za zakazivanje.
Za GET za koji vaš callback izričito odluči da ga ponovi, Scrapyjev javni pomoćnik za ponovni pokušaj može zadržati obračun ponovnih pokušaja uz novi zahtjev:
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
Ovo je pomoćnik pauka. Pozivatelj mora vratiti ili yieldati dobijeni Request kada je dostupan. None znači da je pomoćnik odbio još jedan ponovni pokušaj u okviru primjenjivog ograničenja.
Pomoćnik za ponovni pokušaj kopira zahtjev, ažurira broj ponovnih pokušaja i pruža ponašanje planera prikladno za ponovni pokušaj. Ako samo yieldate isti URL kao običan novi zahtjev, umjesto toga možete naići na filtriranje duplikata.
Koristite proxy URL koji podržava omogućeni HttpProxyMiddleware. Za ponovne pokušaje dopuštenih javnih GET zahtjeva, neautentificirani HTTP kandidat s popisa HTTP proxyja može osigurati proxy_url. Brisanje prethodno priloženog polja proxy-authorization sprječava prenošenje zaglavlja starog posrednika u ovaj odabir; pustite middleware da izvede novi račun iz novog proxy URL-a kada je primjenjivo.
Držite ovaj odabir na razini callbacka odvojenim od automatske obrade konfiguriranih kvarova RetryMiddlewarea. Odlučite koji sloj posjeduje ponovni pokušaj kako operacija ne bi trošila dva neovisna budžeta. Primjer se tiče GET posla koji se može ponoviti, a ne obećanja da je ponavljanje bilo koje poslane transakcije sigurno.