Ponovite Scrapy GET kroz drugi proxy
Koristite Scrapyjev pomoćnik za ponovni pokušaj da zakažete novi zahtev sa novim proxyjem, poštujući budžet ponovnih pokušaja.
Promena response.request.meta menja Python objekat. 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 zahtev:
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. Pozivalac mora vratiti ili yieldovati dobijeni Request kada je dostupan. None znači da je pomoćnik odbio još jedan ponovni pokušaj unutar primenljivog ograničenja.
Pomoćnik za ponovni pokušaj kopira zahtev, ažurira njegov broj ponovnih pokušaja i pruža ponašanje planera primereno ponovnom pokušaju. Ako samo yieldujete isti URL kao običan novi zahtev, umesto toga možete naići na filtriranje duplikata.
Koristite proxy URL koji podržava omogućeni HttpProxyMiddleware. Za ponovne pokušaje dozvoljenih javnih GET zahteva, neautentifikovani HTTP kandidat sa liste HTTP proxyja može obezbediti proxy_url. Brisanje prethodno priloženog polja proxy-authorization sprečava prenošenje zaglavlja starog posrednika u ovaj izbor; pustite middleware da izvede novi nalog iz novog proxy URL-a kada je primenljivo.
Držite ovaj izbor na nivou callbacka odvojenim od automatske obrade konfigurisanih kvarova RetryMiddlewarea. Odlučite koji sloj poseduje ponovni pokušaj kako operacija ne bi trošila dva nezavisna budžeta. Primer se tiče GET posla koji se može ponoviti, a ne obećanja da je ponavljanje bilo koje poslate transakcije bezbedno.