تغيير response.request.meta يغيّر كائن Python. ولإجراء تنزيل آخر، يجب منح Scrapy طلب Request آخر لجدولته.

بالنسبة إلى طلب 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

هذا مساعد خاص بالعنكبوت. على المستدعي إعادة الطلب الناتج أو تمريره عندما يكون متاحًا. تعني None أن المساعد رفض إعادة محاولة أخرى في حدود الحد المطبق.

ينسخ مساعد إعادة المحاولة الطلب ويحدّث عدد محاولاته ويوفّر سلوك المجدول المناسب لإعادة المحاولة. أما تمرير العنوان نفسه كطلب جديد عادي فقد يصطدم بترشيح التكرار.

استخدم عنوان وكيل يدعمه HttpProxyMiddleware المفعّل. لإعادة محاولة طلبات GET العامة المسموح بها، يمكن لمرشح HTTP غير موثّق من قائمة وكلاء HTTP أن يوفّر proxy_url. ومسح حقل proxy-authorization المرفق سابقًا يمنع نقل ترويسة وسيط قديم إلى هذا الاختيار؛ واترك الوسيط يستخرج الحساب الجديد من عنوان الوكيل الجديد عند الاقتضاء.

افصل هذا الاختيار على مستوى رد الاتصال عن معالجة RetryMiddleware التلقائية للأعطال المضبوطة لديه. وحدّد الطبقة التي تملك إعادة المحاولة كي لا تستهلك العملية ميزانيتين مستقلتين. المثال يتعلق بعمل GET قابل للإعادة، وليس وعدًا بأن تكرار معاملة مُرسلة عشوائية آمن.

مقالات ذات صلة