Riprovare un GET di Scrapy tramite un altro proxy
Usate l'helper di retry di Scrapy per pianificare una nuova richiesta con un nuovo proxy rispettando il budget dei tentativi.
Modificare response.request.meta modifica un oggetto Python. Per eseguire un altro download bisogna dare a Scrapy un'altra Request da pianificare.
Per un GET che il vostro callback decide esplicitamente di riprovare, l'helper pubblico di retry di Scrapy può mantenere la contabilità dei tentativi con la nuova richiesta:
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
Questo è un helper per spider. Chi lo chiama deve restituire o fare yield della Request risultante quando ve n'è una disponibile. None significa che l'helper ha rifiutato un altro tentativo entro il limite applicabile.
L'helper di retry copia la richiesta, aggiorna il contatore dei tentativi e fornisce il comportamento dello scheduler adatto a un tentativo. Fare yield dello stesso URL come normale nuova richiesta può invece incontrare il filtraggio dei duplicati.
Usate un URL di proxy supportato dall'HttpProxyMiddleware abilitato. Per i tentativi di richieste GET pubbliche consentite, un candidato HTTP non autenticato dalla lista di proxy HTTP può fornire proxy_url. Rimuovere un campo proxy-authorization allegato in precedenza evita di trasportare l'intestazione di un vecchio intermediario in questa selezione; lasciate che il middleware ricavi il nuovo account dal nuovo URL di proxy quando applicabile.
Tenete questa scelta a livello di callback separata dalla gestione automatica di RetryMiddleware dei suoi guasti configurati. Decidete quale livello possiede il tentativo, così l'operazione non consuma due budget indipendenti. L'esempio riguarda lavoro GET riproducibile, non la promessa che ripetere una transazione inviata arbitraria sia sicuro.