Atkārtot Scrapy GET caur citu starpniekserveri
Izmantojiet Scrapy atkārtošanas palīgu, lai ieplānotu jaunu pieprasījumu ar jaunu starpniekserveri, ievērojot atkārtošanas budžetu.
response.request.meta maiņa maina Python objektu. Lai veiktu vēl vienu lejupielādi, Scrapy jāiedod vēl viens Request, ko ieplānot.
GET pieprasījumam, kuru jūsu callback skaidri nolemj atkārtot, Scrapy publiskais atkārtošanas palīgs var saglabāt atkārtošanas uzskaiti kopā ar jauno pieprasījumu:
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
Šis ir zirnekļa palīgs. Zvanītājam ir jāatgriež vai jāyieldo iegūtais Request, kad tāds ir pieejams. None nozīmē, ka palīgs atteicās no vēl viena atkārtojuma piemērojamā limita ietvaros.
Atkārtošanas palīgs nokopē pieprasījumu, atjaunina tā atkārtošanas skaitītāju un nodrošina atkārtošanai piemērotu plānotāja uzvedību. Ja vienkārši yieldosit to pašu URL kā parastu jaunu pieprasījumu, tā vietā varat saskarties ar dublikātu filtrēšanu.
Izmantojiet starpniekservera URL, ko atbalsta iespējotais HttpProxyMiddleware. Atļauto publisko GET pieprasījumu atkārtošanai neautentificēts HTTP kandidāts no HTTP starpniekserveru saraksta var nodrošināt proxy_url. Iepriekš pievienotā proxy-authorization lauka notīrīšana neļauj veca starpnieka galvenei nonākt šajā izvēlē; ļaujiet middleware atvasināt jauno kontu no jaunā starpniekservera URL, ja tas attiecas.
Turiet šo callback līmeņa izvēli atsevišķi no RetryMiddleware automātiskās konfigurēto kļūdu apstrādes. Izlemiet, kurš slānis pārvalda atkārtošanu, lai darbība netērētu divus neatkarīgus budžetus. Piemērs attiecas uz atkārtojamu GET darbu, nevis solījumu, ka patvaļīgas iesniegtas transakcijas atkārtošana ir droša.