Scrapy爬取rightmove站点报410错误但shell可正常访问如何解决
问题根因
Scrapy 框架默认仅会将 200~399 区间的HTTP响应传递给爬虫解析回调函数,410属于客户端错误状态码,默认会被内置的HttpErrorMiddleware拦截过滤,就是你日志中输出的HTTP status code is not handled or not allowed的来源。你在Scrapy Shell中能正常拿到响应,是因为Shell环境默认关闭了状态码过滤逻辑,和站点封禁没有关系。
解决步骤
方法1:全局配置允许410状态码
在项目settings.py中添加如下配置,全局放开410状态码的处理权限,适合需要批量抓取已下架房源的场景:
HTTPERROR_ALLOWED_CODES = [410]
该配置生效后,所有请求返回的410响应都会进入后续的解析流程。
方法2:单个请求单独指定允许状态码
如果仅需要部分请求处理410响应,无需全局修改配置,在构造Request请求时传入meta参数即可:
yield scrapy.Request( url="https://www.rightmove.co.uk/properties/105717104#/?channel=RES_NEW", meta={"handle_httpstatus_list": [410]}, callback=self.parse_property )
解析逻辑适配
在对应的解析回调函数中,判断状态码后匹配页面提示文本即可完成已售出房源的识别:
def parse_property(self, response): property_item = {} property_item["url"] = response.url if response.status == 410: # 识别已移除房源 if "This property has been removed by the agent." in response.text: property_item["status"] = "已下架/已售出" # 补充其余需要提取的字段 else: property_item["status"] = "在售" # 正常在售房源的字段提取逻辑 yield property_item
注意事项
如果后续需要处理其他特殊状态码,可以直接在HTTPERROR_ALLOWED_CODES或者handle_httpstatus_list的列表中追加对应状态码即可,不建议放开所有4xx/5xx状态码,避免处理无效响应浪费资源。
内容的提问来源于stack exchange,提问作者Alfin Paul
相关产品推荐
相关产品推荐

