Menukar response.request.meta menukar objek Python. Untuk membuat muat turun lain, berikan Scrapy Request lain untuk dijadualkan.

Untuk GET yang callback anda putuskan secara eksplisit untuk cuba semula, pembantu cuba semula awam Scrapy boleh menyimpan kiraan cuba semula dengan permintaan baharu:

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

Ini ialah pembantu spider. Pemanggil mesti mengembalikan atau yield Request yang terhasil apabila ada. None bermaksud pembantu menolak cubaan semula lain dalam had yang berkenaan.

Pembantu cuba semula menyalin permintaan, mengemas kini kiraan cuba semulanya dan menyediakan tingkah laku penjadual yang sesuai untuk cubaan semula. Hanya yield URL yang sama sebagai permintaan baharu biasa mungkin sebaliknya menemui penapisan pendua.

Gunakan URL proksi yang disokong oleh HttpProxyMiddleware yang didayakan. Untuk cubaan semula permintaan GET awam yang dibenarkan, calon HTTP tanpa pengesahan daripada senarai proksi HTTP boleh membekalkan proxy_url. Mengosongkan medan proxy-authorization yang dilampirkan sebelum ini mengelakkan pembawaan pengepala perantara lama ke dalam pilihan ini; biarkan middleware memperoleh akaun baharu daripada URL proksi baharu apabila berkenaan.

Asingkan pilihan peringkat callback ini daripada pengendalian automatik RetryMiddleware bagi kegagalan yang dikonfigurasikannya. Tentukan lapisan mana yang memiliki cubaan semula supaya operasi tidak menggunakan dua bajet bebas. Contoh ini berkaitan kerja GET yang boleh dimainkan semula, bukan janji bahawa mengulang transaksi yang dihantar secara sewenang-wenangnya adalah selamat.

Artikel berkaitan