Pakartoti Scrapy GET per kitą proxy
Naudokite Scrapy pakartojimo pagalbininką naujai užklausai su nauju proxy suplanuoti, paisydami pakartojimų biudžeto.
response.request.meta pakeitimas pakeičia Python objektą. Norint dar kartą atsisiųsti, Scrapy reikia duoti kitą Request, kurį būtų galima suplanuoti.
GET užklausai, kurią jūsų callback aiškiai nusprendžia kartoti, Scrapy viešasis pakartojimo pagalbininkas gali išlaikyti pakartojimų apskaitą su nauja užklausa:
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
Tai vorų pagalbininkas. Iškviečiantysis turi grąžinti arba yieldinti gautą Request, kai jis prieinamas. None reiškia, kad pagalbininkas atsisakė dar vieno pakartojimo pagal taikomą limitą.
Pakartojimo pagalbininkas nukopijuoja užklausą, atnaujina jos pakartojimų skaitiklį ir suteikia planuotojo elgseną, tinkamą pakartojimui. Jei tiesiog yieldinsite tą patį URL kaip įprastą naują užklausą, galite susidurti su dublikatų filtravimu.
Naudokite proxy URL, kurį palaiko įjungtas HttpProxyMiddleware. Leidžiamų viešų GET užklausų pakartojimams neautentifikuotas HTTP kandidatas iš HTTP proxy sąrašo gali pateikti proxy_url. Anksčiau pridėto proxy-authorization lauko išvalymas neleidžia seno tarpininko antraštės patekti į šį pasirinkimą; leiskite middleware išvesti naują paskyrą iš naujo proxy URL, kai tai taikoma.
Laikykite šį callback lygio pasirinkimą atskirai nuo automatinio RetryMiddleware sukonfigūruotų gedimų apdorojimo. Nuspręskite, kuris sluoksnis valdo pakartojimą, kad operacija nesunaudotų dviejų nepriklausomų biudžetų. Pavyzdys susijęs su pakartojamu GET darbu, o ne pažadu, kad savavališkos pateiktos transakcijos kartojimas yra saugus.