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 सहायक है। कॉलर को परिणामी Request उपलब्ध होने पर लौटाना या yield करना चाहिए। None का अर्थ है कि सहायक ने लागू सीमा के भीतर एक और पुनः प्रयास से इंकार कर दिया।

पुनः प्रयास सहायक अनुरोध की प्रतिलिपि बनाता है, उसका पुनः प्रयास काउंटर अद्यतन करता है और पुनः प्रयास के लिए उपयुक्त शेड्यूलर व्यवहार प्रदान करता है। केवल उसी URL को सामान्य नए अनुरोध के रूप में yield करने पर इसके बजाय डुप्लिकेट फ़िल्टरिंग मिल सकती है।

सक्रिय HttpProxyMiddleware द्वारा समर्थित प्रॉक्सी URL का उपयोग करें। अनुमत सार्वजनिक GET अनुरोधों के पुनः प्रयास के लिए, HTTP प्रॉक्सी सूची से एक बिना प्रमाणीकरण वाला HTTP उम्मीदवार proxy_url प्रदान कर सकता है। पहले जुड़े proxy-authorization फ़ील्ड को साफ़ करने से पुराने मध्यस्थ का हेडर इस चयन में नहीं जाता; जहाँ लागू हो, मिडलवेयर को नए प्रॉक्सी URL से नया खाता निकालने दें।

इस callback-स्तरीय चयन को RetryMiddleware के अपने कॉन्फ़िगर किए गए विफलताओं के स्वचालित प्रबंधन से अलग रखें। तय करें कि पुनः प्रयास किस परत का है ताकि क्रिया दो स्वतंत्र बजट न खर्च करे। उदाहरण दोहराए जा सकने वाले GET कार्य के बारे में है, यह वादा नहीं कि किसी भी प्रस्तुत लेनदेन को दोहराना सुरक्षित है।

संबंधित लेख