Torna a provar un GET de Scrapy a través d'un altre proxy
Utilitzeu l'ajudant de reintents de Scrapy per programar una petició nova amb un proxy nou respectant el pressupost de reintents.
Canviar response.request.meta canvia un objecte de Python. Per fer una altra descàrrega, cal donar a Scrapy una altra Request per programar.
Per a un GET que la vostra callback decideix explícitament reintentar, l'ajudant públic de reintents de Scrapy pot mantenir el recompte de reintents amb la petició nova:
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
Aquest és un ajudant d'Spider. Qui el crida ha de retornar o fer yield de la Request resultant quan n'hi hagi una. None vol dir que l'ajudant ha rebutjat un altre reintent dins del límit aplicable.
L'ajudant de reintents copia la petició, actualitza el seu comptador de reintents i proporciona el comportament de planificador adequat per a un reintent. Fer yield de la mateixa URL com una petició nova ordinària pot topar amb el filtratge de duplicats.
Utilitzeu una URL de proxy compatible amb l'HttpProxyMiddleware actiu. Per als reintents de peticions GET públiques permeses, un candidat HTTP sense autenticació de la llista de proxys HTTP pot proporcionar proxy_url. Esborrar un camp proxy-authorization adjuntat prèviament evita arrossegar la capçalera d'un intermediari antic en aquesta selecció; deixeu que el middleware obtingui el compte nou de la URL de proxy nova quan correspongui.
Mantingueu aquesta tria a nivell de callback separada del maneig automàtic de RetryMiddleware de les seves fallades configurades. Decidiu quina capa posseeix el reintent perquè l'operació no consumeixi dos pressupostos independents. L'exemple tracta de feina GET reproduïble, no d'una promesa que repetir una transacció enviada arbitrària sigui segur.