response.request.meta ni o'zgartirish Python obyektini o'zgartiradi. Yana bir yuklab olish uchun Scrapy'ga rejalashtirish uchun boshqa Request berish kerak.

Callbackingiz aniq qayta urinishga qaror qilgan GET uchun Scrapy'ning ommaviy qayta urinish yordamchisi qayta urinish hisobini yangi so'rov bilan birga saqlashi mumkin:

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

Bu spider yordamchisi. Chaqiruvchi mavjud bo'lganda olingan Requestni qaytarishi yoki yield qilishi kerak. None yordamchining amaldagi chegara doirasida yana bir qayta urinishdan bosh tortganini bildiradi.

Qayta urinish yordamchisi so'rovni nusxalaydi, qayta urinishlar sonini yangilaydi va qayta urinishga mos rejalashtiruvchi xatti-harakatini taqdim etadi. Xuddi shu URLni oddiy yangi so'rov sifatida yield qilish o'rniga nusxalarni filtrlashga duch kelishi mumkin.

Yoqilgan HttpProxyMiddleware qo'llab-quvvatlaydigan proksi URL dan foydalaning. Ruxsat etilgan ommaviy GET so'rovlarini qayta urinish uchun HTTP proksilari ro'yxatidan autentifikatsiyalanmagan HTTP nomzodi proxy_url taqdim etishi mumkin. Ilgari biriktirilgan proxy-authorization maydonini tozalash eski vositachining sarlavhasi bu tanlovga o'tishining oldini oladi; zarur bo'lganda middleware yangi hisobni yangi proksi URL dan chiqarishiga ruxsat bering.

Ushbu callback darajasidagi tanlovni RetryMiddleware'ning sozlangan nosozliklarini avtomatik qayta ishlashidan alohida saqlang. Qayta urinish qaysi qatlamga tegishli ekanini hal qiling, shunda operatsiya ikkita mustaqil byudjet sarflamaydi. Misol qayta o'ynatiladigan GET ishi haqida, o'zboshimchalik bilan yuborilgan tranzaksiyani takrorlash xavfsiz degan va'da emas.

O'xshash maqolalar