Mengubah response.request.meta mengubah objek Python. Untuk melakukan unduhan lain, berikan Scrapy Request lain untuk dijadwalkan.

Untuk GET yang callback Anda putuskan secara eksplisit untuk dicoba ulang, pembantu percobaan ulang publik Scrapy dapat menyimpan perhitungan percobaan ulang pada permintaan baru:

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 adalah pembantu spider. Pemanggilnya harus mengembalikan atau yield Request yang dihasilkan bila tersedia. None berarti pembantu menolak percobaan ulang lain dalam batas yang berlaku.

Pembantu percobaan ulang menyalin permintaan, memperbarui jumlah percobaan ulangnya, dan menyediakan perilaku penjadwal yang sesuai untuk percobaan ulang. Hanya melakukan yield URL yang sama sebagai permintaan baru biasa malah dapat menemui penyaringan duplikat.

Gunakan URL proxy yang didukung oleh HttpProxyMiddleware yang aktif. Untuk percobaan ulang permintaan GET publik yang diizinkan, kandidat HTTP tanpa autentikasi dari daftar proxy HTTP dapat menyediakan proxy_url. Menghapus bidang proxy-authorization yang sebelumnya terlampir mencegah terbawanya header perantara lama ke pilihan ini; biarkan middleware menurunkan akun baru dari URL proxy baru bila relevan.

Pisahkan pilihan di tingkat callback ini dari penanganan otomatis RetryMiddleware atas kegagalan yang dikonfigurasi. Tentukan lapisan mana yang memiliki percobaan ulang agar operasi tidak memakai dua anggaran independen. Contoh ini menyangkut pekerjaan GET yang dapat diputar ulang, bukan janji bahwa mengulang transaksi yang dikirim sembarangan itu aman.

Artikel terkait