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 فیلڈ صاف کرنے سے پرانے ثالث کی ہیڈر اس انتخاب میں آنے سے بچتی ہے؛ جہاں لاگو ہو، middleware کو نئی پراکسی URL سے نیا اکاؤنٹ اخذ کرنے دیں۔

اس callback سطح کے انتخاب کو RetryMiddleware کی اپنی ترتیب شدہ ناکامیوں کی خودکار معاونت سے الگ رکھیں۔ فیصلہ کریں کہ دوبارہ کوشش کس طبقے کی ہے تاکہ عمل دو آزاد بجٹ استعمال نہ کرے۔ مثال دوبارہ چلائی جا سکنے والی GET کام کے بارے میں ہے، یہ وعدہ نہیں کہ کوئی بھی جمع کرائی گئی ٹرانزیکشن دہرانا محفوظ ہے۔

متعلقہ مضامین