Повторете Scrapy GET преку друг прокси
Користете го помагачот за повторување на Scrapy за да закажете ново барање со нов прокси, почитувајќи го буџетот за повторувања.
Менувањето на response.request.meta менува Python објект. За уште едно преземање, на Scrapy треба да му дадете друг Request за закажување.
За GET што вашиот callback експлицитно одлучува да го повтори, јавниот помагач за повторување на Scrapy може да го задржи пресметувањето на повторувањата со новото барање:
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
Ова е помагач за пајак. Повикувачот мора да го врати или yield-не добиениот Request кога е достапен. None значи дека помагачот одбил уште едно повторување во рамките на применливиот лимит.
Помагачот за повторување го копира барањето, го ажурира бројот на повторувања и обезбедува однесување на планерот соодветно за повторување. Ако само yield-нете истиот URL како обично ново барање, наместо тоа може да наидете на филтрирање на дупликати.
Користете прокси URL што го поддржува овозможениот HttpProxyMiddleware. За повторувања на дозволени јавни GET барања, неавтентифициран HTTP кандидат од списокот на HTTP прокси може да обезбеди proxy_url. Бришењето на претходно прикачено поле proxy-authorization спречува пренесување на заглавието на стар посредник во овој избор; дозволете middleware да го изведе новиот профил од новиот прокси URL кога е применливо.
Држете го овој избор на ниво на callback одделно од автоматската обработка на конфигурираните неуспеси од RetryMiddleware. Одлучете кој слој го поседува повторувањето за операцијата да не троши два независни буџети. Примерот се однесува на работа со GET што може да се повтори, а не на ветување дека повторувањето на произволна поднесена трансакција е безбедно.