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

Սա spider-ի օժանդակ է։ Կանչողը պետք է վերադարձնի կամ yield անի ստացված Request-ը, երբ այն հասանելի է։ None նշանակում է, որ օժանդակը հրաժարվել է ևս մեկ կրկնափորձից կիրառելի սահմանում։

Կրկնափորձի օժանդակը պատճենում է հարցումը, թարմացնում դրա կրկնափորձերի հաշվիչը և ապահովում է կրկնափորձին համապատասխան պլանավորողի վարքը։ Նույն URL-ը սովորական նոր հարցումի պես yield անելը կարող է փոխարենը հանդիպել կրկնօրինակների զտմանը։

Օգտագործեք պրոքսի URL, որն աջակցում է միացված HttpProxyMiddleware-ը։ Թույլատրված հանրային GET հարցումների կրկնափորձերի համար HTTP պրոքսիների ցանկից չնույնականացված HTTP թեկնածուն կարող է տրամադրել proxy_url։ Նախկինում կցված proxy-authorization դաշտը մաքրելը խոչընդոտում է հին միջնորդի վերնագրի փոխանցումը այս ընտրությանը. թողեք middleware-ը նոր հաշիվը ստանա նոր պրոքսի URL-ից, երբ դա տեղին է։

Այս callback-մակարդակի ընտրությունը առանձին պահեք RetryMiddleware-ի կողմից իր կազմաձևված ձախողումների ավտոմատ մշակումից։ Որոշեք, թե որ շերտին է պատկանում կրկնափորձը, որպեսզի գործողությունը չծախսի երկու անկախ բյուջե։ Օրինակը վերաբերում է կրկնարկվող GET աշխատանքին, ոչ թե խոստման, որ կամայական ուղարկված գործարքի կրկնումը անվտանգ է։

Առնչվող հոդվածներ