Scrapy 框架里代理IP怎么接:中间件与重试策略-易代理

本站 · 2026-10-28 最新资讯 6

Scrapy 项目不用在 spider 里手写 proxies 字典,正确做法是下沉到下载中间件。这样代理IP、重试、换 IP 对业务代码透明。

一、基础中间件写法

pythonclass ProxyMiddleware:    def process_request(self, request, spider):
        request.meta["proxy"] = "http://user:pass@gate:port"

启用:

pythonDOWNLOADER_MIDDLEWARES = {    "myproj.middlewares.ProxyMiddleware": 110,
}

需要鉴权时加头:

pythonauth = base64.b64encode(b"user:pass").decode()
request.headers["Proxy-Authorization"] = f"Basic {auth}"

二、动态从代理池取节点

中间件里读本地池:

pythonrequest.meta["proxy"] = proxy_pool.pick()
request.meta["proxy_tag"] = node.url

响应返回后,用 process_response 回写成功/失败:

pythondef process_response(self, request, response, spider):    if response.status >= 400:
        proxy_pool.mark_fail(request.meta["proxy_tag"])    else:
        proxy_pool.mark_ok(request.meta["proxy_tag"])    return response

三、异常换 IP 重试

pythondef process_exception(self, request, exception, spider):
    proxy_pool.mark_fail(request.meta["proxy_tag"])
    request.meta["proxy"] = proxy_pool.pick()    return request  # 重新调度

配合 RETRY_TIMES=3,失败自动换出口。

四、Robots 与下载延迟

Scrapy 自带:

pythonROBOTSTXT_OBEY = TrueDOWNLOAD_DELAY = 1RANDOMIZE_DOWNLOAD_DELAY = True

代理IP 不是用来“硬刚反爬”,是让请求节奏更分散、更靠近正常访问。

五、Splash/Headless 场景

需要渲染时,代理放下载层;浏览器内请求走系统代理或启动参数。别两层代理冲突。

Scrapy 接代理IP 的成熟做法:中间件管出口,调度器管重试,spider 只写解析。


微信客服

微信客服

扫码添加客服

QQ 咨询

新用户专享 注册免费送 IP 5000个 高质量 IP 免费领取 立即领取