scrapy-proxy-pool: hantera binära svar i bandetektering
Begränsa scrapy-proxy-pools textmönsterkontroll till TextResponse och behåll beslut om status och tom kropp.
En PDF eller bild kan komma igenom en proxy och sedan misslyckas i bandetekteringen. Scrapys bas-Response exponerar kroppsbyten, men dess text-egenskap kastar felet ”Response content isn't text.”
Om den installerade scrapy-proxy-pool-policyn söker i response.text utan villkor, ersätt policyn med en typmedveten version:
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
Välj den via paketets tilläggsinställning:
PROXY_POOL_BAN_POLICY = "myproject.policy.BinaryAwarePolicy"
Detta behåller policyns regler för status och tom kropp och begränsar textsökningen till svar som stöder den. Den ärvda undantagspolicyn finns fortfarande tillgänglig.
Gå också igenom de återstående reglerna för applikationen: ett avsiktligt tomt 200-svar eller ett vanligt destinationsfel är inte alltid bevis på en dålig proxy. Låt middleware vara aktivt och ändra den klassificering som orsakade felet, i stället för att stänga av all bandetektering för binära nedladdningar.