ไฟล์ PDF หรือรูปภาพอาจมาถึงผ่านพร็อกซี่ได้สำเร็จแล้วล้มเหลวในการตรวจจับการแบน Response พื้นฐานของ Scrapy เปิดเผยไบต์ของเนื้อหา แต่คุณสมบัติ text ของมันทำให้เกิดข้อผิดพลาด “Response content isn't text.”

หากนโยบาย scrapy-proxy-pool ที่ติดตั้งไว้ค้นหา response.text โดยไม่มีเงื่อนไข ให้แทนที่ด้วยเวอร์ชันที่ตระหนักถึงชนิด:

from scrapy.http import TextResponse
from scrapy_proxy_pool.policy import BanDetectionPolicy

class BinaryAwarePolicy(BanDetectionPolicy):
    def response_is_ban(self, request, response):
        if isinstance(response, TextResponse):
            if self.BANNED_PATTERN.search(response.text):
                return True
        if response.status not in self.NOT_BAN_STATUSES:
            return True
        return response.status == 200 and not response.body

เลือกผ่านการตั้งค่าส่วนขยายของแพ็กเกจ:

PROXY_POOL_BAN_POLICY = "myproject.policy.BinaryAwarePolicy"

วิธีนี้ยังคงกฎเรื่องสถานะและเนื้อหาว่างของนโยบายไว้ และจำกัดการค้นหาข้อความไว้เฉพาะการตอบสนองที่รองรับเท่านั้น นโยบายข้อยกเว้นที่สืบทอดมายังคงใช้งานได้

ตรวจสอบกฎที่เหลือเหล่านั้นสำหรับแอปพลิเคชันด้วย: การตอบสนอง 200 ที่ว่างเปล่าโดยเจตนาหรือข้อผิดพลาดปลายทางทั่วไปไม่ใช่หลักฐานของพร็อกซี่แย่เสมอไป ปล่อยให้มิดเดิลแวร์ทำงานอยู่และเปลี่ยนการจำแนกประเภทที่ทำให้เกิดความล้มเหลว แทนที่จะปิดการตรวจจับการแบนทั้งหมดสำหรับการดาวน์โหลดไบนารี

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