การเปลี่ยน response.request.meta เปลี่ยนอ็อบเจ็กต์ Python หากต้องการดาวน์โหลดอีกครั้ง ต้องให้ Request อื่นแก่ Scrapy เพื่อจัดตาราง

สำหรับ GET ที่ callback ของคุณตัดสินใจลองใหม่อย่างชัดเจน ตัวช่วยลองใหม่สาธารณะของ 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 ผู้เรียกต้องคืนหรือ yield Request ที่ได้เมื่อมีอยู่ None หมายความว่าตัวช่วยปฏิเสธการลองใหม่อีกครั้งภายใต้ขีดจำกัดที่ใช้

ตัวช่วยลองใหม่คัดลอกคำขอ อัปเดตจำนวนการลองใหม่ และจัดเตรียมพฤติกรรมของตัวจัดตารางที่เหมาะกับการลองใหม่ การ yield URL เดิมเป็นคำขอใหม่ธรรมดาอาจเจอการกรองรายการซ้ำแทน

ใช้ URL พร็อกซีที่ HttpProxyMiddleware ที่เปิดใช้งานรองรับ สำหรับการลองใหม่ของคำขอ GET สาธารณะที่ได้รับอนุญาต ผู้สมัคร HTTP ที่ไม่มีการพิสูจน์ตัวตนจากรายการพร็อกซี HTTPสามารถให้ proxy_url ได้ การล้างฟิลด์ proxy-authorization ที่แนบไว้ก่อนหน้าจะป้องกันไม่ให้ส่วนหัวของตัวกลางเก่าติดเข้ามาในการเลือกนี้ ปล่อยให้มิดเดิลแวร์ดึงบัญชีใหม่จาก URL พร็อกซีใหม่เมื่อเกี่ยวข้อง

แยกการเลือกในระดับ callback นี้ออกจากการจัดการอัตโนมัติของ RetryMiddleware สำหรับความล้มเหลวที่กำหนดค่าไว้ ตัดสินว่าชั้นใดเป็นเจ้าของการลองใหม่เพื่อให้การดำเนินการไม่ใช้สองงบประมาณที่เป็นอิสระ ตัวอย่างเกี่ยวกับงาน GET ที่เล่นซ้ำได้ ไม่ใช่คำสัญญาว่าการทำธุรกรรมที่ส่งโดยพลการซ้ำจะปลอดภัย

บทความที่เกี่ยวข้อง