A response.request.meta módosítása egy Python-objektumot módosít. Egy újabb letöltéshez új Requestet kell adni a Scrapynak ütemezésre.

Egy GET esetében, amelyet a callbackje kifejezetten újrapróbálni dönt, a Scrapy nyilvános újrapróbálkozás-segítője az új kéréssel együtt vezetheti az újrapróbálkozások elszámolását:

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

Ez egy spider-segítő. A hívónak vissza kell adnia vagy yieldelnie kell az eredményül kapott Requestet, amikor elérhető. A None azt jelenti, hogy a segítő elutasított egy további újrapróbálkozást az alkalmazandó korláton belül.

Az újrapróbálkozás-segítő lemásolja a kérést, frissíti az újrapróbálkozás-számlálóját, és biztosítja az újrapróbálkozáshoz illő ütemező-viselkedést. Ha csupán ugyanazt az URL-t yieldeli közönséges új kérésként, inkább a duplikátumszűrésbe futhat.

Használjon az engedélyezett HttpProxyMiddleware által támogatott proxy-URL-t. Az engedélyezett nyilvános GET-kérések újrapróbálkozásaihoz a HTTP-proxylista hitelesítés nélküli HTTP-jelöltje biztosíthat proxy_url-t. Egy korábban csatolt proxy-authorization mező törlése megakadályozza, hogy egy régi közvetítő fejléce bekerüljön ebbe a kiválasztásba; hagyja, hogy a middleware a megfelelő esetben az új proxy-URL-ből származtassa az új fiókot.

Tartsa ezt a callback-szintű választást külön a RetryMiddleware beállított hibáinak automatikus kezelésétől. Döntse el, melyik réteg birtokolja az újrapróbálkozást, hogy a művelet ne fogyasszon két független keretet. A példa újrajátszható GET-munkára vonatkozik, nem arra az ígéretre, hogy egy tetszőlegesen benyújtott tranzakció megismétlése biztonságos.

Kapcsolódó cikkek