代理 GET 可能先到达服务器,然后一路跟随重定向,直到最终失败掩盖了第一个响应。为便于诊断,先把那个初始响应暴露出来:

request = scrapy.Request(
    'https://service.example/page',
    callback=inspect_redirect,
    meta={
        'proxy': 'http://proxy.example:8080',
        'dont_redirect': True,
        'handle_httpstatus_list': [301, 302, 303, 307, 308],
    },
)

通过蜘蛛现有的 start 或 callback 流程安排这个请求。对于允许的公开页面探测,HTTP 代理列表 会为该请求的代理 URL 提供候选。inspect_redirect 应当记录响应状态和 Location 头,而不是再次盲目跟随。

dont_redirect 会停止此请求的自动重定向。handle_httpstatus_list 让指定的状态码进入 callback,而不是被 HTTP 错误过滤拒掉。这两项设置针对的是不同中间件的职责。

检查重定向到底选中了什么:预期的规范 URL、不同的协议或主机名、登录页,还是反复出现的循环。传输成功后收到的 302,与打不开代理连接是两种不同的观察结果。

恢复正常重定向处理后,Scrapy 会在响应的请求元数据中暴露 redirect_urls 和 redirect_reasons。它们可以保留通往最终结果的路径,而不必让整个抓取过程都禁用重定向。

最终响应并不自动就是应用想要的那个页面。把目的地和响应内容与路由诊断放在一起看。

相关文章