response.request.meta બદલવાથી Python ઑબ્જેક્ટ બદલાય છે. બીજું ડાઉનલોડ કરવા Scrapy ને શેડ્યૂલ કરવા માટે બીજી Request આપવી પડે.

તમારો callback જે 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

આ spider સહાયક છે. બોલાવનારે પરિણામી Request ઉપલબ્ધ હોય ત્યારે પાછી આપવી કે yield કરવી જોઈએ. None નો અર્થ છે કે સહાયકે લાગુ મર્યાદામાં બીજો ફરી પ્રયાસ નકાર્યો.

ફરી પ્રયાસ સહાયક વિનંતીની નકલ કરે છે, તેનો ફરી પ્રયાસ ગણક અપડેટ કરે છે અને ફરી પ્રયાસ માટે યોગ્ય શેડ્યૂલર વર્તન પૂરું પાડે છે. એ જ URL ને સામાન્ય નવી વિનંતી તરીકે yield કરવાથી તેના બદલે નકલ ગાળણમાં આવી શકાય.

સક્રિય HttpProxyMiddleware જે પ્રોક્સી URL ને સમર્થન આપે છે તે વાપરો. મંજૂર જાહેર GET વિનંતીઓના ફરી પ્રયાસ માટે, HTTP પ્રોક્સી યાદીમાંથી પ્રમાણીકરણ વગરનો HTTP ઉમેદવાર proxy_url પૂરો પાડી શકે છે. અગાઉ જોડાયેલ proxy-authorization ક્ષેત્ર સાફ કરવાથી જૂના મધ્યસ્થનું હેડર આ પસંદગીમાં જતું અટકે છે; લાગુ હોય ત્યારે મિડલવેરને નવા પ્રોક્સી URL પરથી નવું ખાતું મેળવવા દો.

આ callback-સ્તરની પસંદગીને RetryMiddleware ના ગોઠવેલ નિષ્ફળતાઓના સ્વયંસંચાલિત સંચાલનથી અલગ રાખો. નક્કી કરો કે ફરી પ્રયાસ કયા સ્તરનો છે જેથી ક્રિયા બે સ્વતંત્ર બજેટ વાપરે નહીં. ઉદાહરણ ફરી ચલાવી શકાય તેવા GET કામ વિશે છે, મનસ્વી રીતે સબમિટ કરેલા વ્યવહારને પુનરાવર્તિત કરવો સુરક્ષિત છે તેવું વચન નથી.

સંબંધિત લેખો