response.request.meta మార్చడం Python వస్తువును మారుస్తుంది. మరొక డౌన్‌లోడ్ చేయడానికి Scrapyకి షెడ్యూల్ చేయడానికి మరొక Request ఇవ్వాలి.

మీ callback స్పష్టంగా మళ్లీ ప్రయత్నించాలని నిర్ణయించే GET కోసం, 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 సహాయకుడు. పిలిచేవాడు అందుబాటులో ఉన్నప్పుడు వచ్చిన Requestని తిరిగి ఇవ్వాలి లేదా yield చేయాలి. None అంటే వర్తించే పరిమితిలో సహాయకుడు మరొక మళ్లీ ప్రయత్నాన్ని తిరస్కరించాడు.

మళ్లీ ప్రయత్నం సహాయకుడు అభ్యర్థనను కాపీ చేస్తాడు, దాని మళ్లీ ప్రయత్నాల సంఖ్యను నవీకరిస్తాడు మరియు మళ్లీ ప్రయత్నానికి సరిపోయే షెడ్యూలర్ ప్రవర్తనను అందిస్తాడు. అదే URLని సాధారణ కొత్త అభ్యర్థనగా yield చేయడం బదులుగా నకలు ఫిల్టరింగ్‌కు చిక్కవచ్చు.

ప్రారంభించిన HttpProxyMiddleware మద్దతు ఇచ్చే ప్రాక్సీ URL ఉపయోగించండి. అనుమతించిన పబ్లిక్ GET అభ్యర్థనల మళ్లీ ప్రయత్నాలకు, HTTP ప్రాక్సీ జాబితా నుండి ప్రామాణీకరణ లేని HTTP అభ్యర్థి proxy_url అందించగలడు. మునుపు జోడించిన proxy-authorization ఫీల్డ్‌ను తొలగించడం పాత మధ్యవర్తి హెడర్ ఈ ఎంపికలోకి రాకుండా నిరోధిస్తుంది; వర్తించినప్పుడు కొత్త ప్రాక్సీ URL నుండి కొత్త ఖాతాను మిడిల్‌వేర్ పొందనివ్వండి.

ఈ callback-స్థాయి ఎంపికను RetryMiddleware తన కాన్ఫిగర్ చేసిన వైఫల్యాలను స్వయంచాలకంగా నిర్వహించడం నుండి వేరుగా ఉంచండి. మళ్లీ ప్రయత్నం ఏ పొరది అని నిర్ణయించండి, తద్వారా ఆపరేషన్ రెండు స్వతంత్ర బడ్జెట్‌లను ఖర్చు చేయదు. ఉదాహరణ మళ్లీ నడపగల GET పని గురించి, ఏకపక్షంగా సమర్పించిన లావాదేవీని పునరావృతం చేయడం సురక్షితం అనే హామీ కాదు.

సంబంధిత వ్యాసాలు