Scrapy 里爬虫采集用代理IP:中间件与分池架构-易代理
Scrapy 项目别在 spider 里写 proxies 字典。代理IP 要下沉到下载中间件,业务代码只管解析。
一、基础中间件挂代理
pythonclass ProxyMiddleware: def process_request(self, request, spider): proxy = proxy_pool.pick() request.meta["proxy"] = proxy.url request.meta["proxy_tag"] = proxy.tag
启用:
pythonDOWNLOADER_MIDDLEWARES = { "myproj.middlewares.ProxyMiddleware": 110,
}账密代理加头:
pythonauth = base64.b64encode(b"user:pass").decode()
request.headers["Proxy-Authorization"] = f"Basic {auth}"二、响应与异常回写评分
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 responsedef process_exception(self, request, exception, spider): proxy_pool.mark_fail(request.meta["proxy_tag"]) request.meta["proxy"] = proxy_pool.pick().url return request
配合 RETRY_TIMES=3,失败自动换出口。
三、按目标站分池
python# 价格站用动态池,重点SKU用静态池if url in KEY_SKUS: request.meta["proxy"] = static_pool.pick()else: request.meta["proxy"] = dynamic_pool.pick()
中间件只做调度,不判断业务含义。分池规则放配置中心。
四、限速与 robots 前置
pythonROBOTSTXT_OBEY = TrueDOWNLOAD_DELAY = 1RANDOMIZE_DOWNLOAD_DELAY = True
代理IP 让出口分散,但请求节奏仍要像正常访问。429 自动暂停,不重试爆破。
五、渲染任务单独处理
需要浏览器渲染时,代理放下载层;无头浏览器内请求走系统代理。两层别冲突,别在中间件里同时挂两次。
爬虫采集用代理IP 在 Scrapy 里成熟做法:中间件管出口,调度器管重试,spider 只写解析。
相关标签:代理ip,ip代理,http代理,代理服务器ip,开放代理,文档中心,新闻,动态住宅ip,ip池,socks5代理