Scrapy 框架里代理IP怎么接:中间件与重试策略-易代理
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 只写解析。