You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:18:04