Reîncercarea unui GET Scrapy printr-un alt proxy
Folosiți ajutorul de reîncercare al Scrapy pentru a programa o cerere nouă cu un proxy nou, respectând bugetul de reîncercări.
Modificarea response.request.meta modifică un obiect Python. Pentru o altă descărcare, trebuie să dați Scrapy un alt Request de programat.
Pentru un GET pe care callbackul îl decide explicit să îl reîncerce, ajutorul public de reîncercare al Scrapy poate păstra evidența reîncercărilor la cererea nouă:
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
Acesta este un ajutor de păianjen. Apelantul trebuie să returneze sau să yielduiască Requestul rezultat atunci când există unul disponibil. None înseamnă că ajutorul a refuzat o altă reîncercare în limita aplicabilă.
Ajutorul de reîncercare copiază cererea, actualizează contorul de reîncercări și oferă comportamentul de planificator potrivit pentru o reîncercare. Doar yielduirea aceluiași URL ca o cerere nouă obișnuită poate întâlni în schimb filtrarea duplicatelor.
Folosiți un URL de proxy acceptat de HttpProxyMiddleware activat. Pentru reîncercările cererilor GET publice permise, un candidat HTTP neautentificat din lista de proxy HTTP poate furniza proxy_url. Ștergerea unui câmp proxy-authorization atașat anterior evită aducerea antetului unui intermediar vechi în această selecție; lăsați middleware-ul să deducă noul cont din noul URL de proxy atunci când este cazul.
Țineți această alegere la nivel de callback separată de gestionarea automată de către RetryMiddleware a eșecurilor sale configurate. Decideți care strat deține reîncercarea, astfel încât operația să nu consume două bugete independente. Exemplul privește muncă GET reluabilă, nu o promisiune că reluarea unei tranzacții trimise arbitrar este sigură.