Herhaal 'n Scrapy-GET deur 'n ander proxy
Gebruik Scrapy se herhalingshulp om 'n nuwe versoek met 'n nuwe proxy te skeduleer terwyl die herhalingsbegroting gerespekteer word.
Om response.request.meta te verander, verander 'n Python-objek. Vir nog 'n aflaai moet Scrapy 'n ander Request kry om te skeduleer.
Vir 'n GET wat jou callback doelbewus probeer herhaal, kan Scrapy se openbare herhalingshulp die herhalingrekening by die nuwe versoek hou:
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
Dit is 'n spinnekop-hulp. Die oproeper moet die resulterende Request teruggee of opbreng wanneer een beskikbaar is. None beteken die hulp het nog 'n herhaling onder die geldende limiet geweier.
Die herhalingshulp kopieer die versoek, werk sy herhalingtelling by en lewer die skeduleerdergedrag wat vir 'n herhaling gepas is. Om bloot dieselfde URL as 'n gewone nuwe versoek op te bring, kan eerder duplikaatfiltering teekom.
Gebruik 'n proxy-URL wat deur die geaktiveerde HttpProxyMiddleware ondersteun word. Vir herhalings van toegelate openbare GET-versoeke kan 'n ongeverifieerde HTTP-kandidaat uit die HTTP-proxylijst proxy_url verskaf. Om 'n voorheen aangehegte proxy-authorization-veld te skrap, verhoed dat 'n ou tussenganger se kop in hierdie keuse oorgedra word; laat die middleware die nuwe rekening uit die nuwe proxy-URL aflei wanneer van toepassing.
Hou hierdie keuse op callback-vlak apart van die outomatiese hantering van RetryMiddleware se gekonfigureerde foute. Besluit watter laag die herhaling besit, sodat die bewerking nie twee onafhanklike begrotings verbruik nie. Die voorbeeld handel oor herhaalbare GET-werk, nie 'n belofte dat die herhaling van 'n willekeurige ingediende transaksie veilig is nie.