Scrapy分布式架构需用Scrapy-Redis替换Scheduler、DupeFilter等组件,共享Redis队列与指纹库;配合动态UA、代理池健康检测、JS渲染方案、分层存储及Prometheus监控实现高可用爬取。
单机Scrapy跑得再快,面对千万级URL也扛不住。分布式核心是把调度、去重、请求分发拆开,让多台机器协同干活。主流方案是用Scrapy-Redis——它把Scheduler、DupeFilter、ItemPipeline都换成Redis后端,天然支持多Spider共享队列和指纹库。
关键操作几步到位:
pip install scrapy-redis,然后在settings.py里替换默认组件:把SCHEDULER设为"scrapy_redis.scheduler.Scheduler",DUPEFILTER_CLASS换成"scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL(如redis://:pwd@192.168.1.100:6379/0)指向同一地址,启动时自动接入start_urls写成Redis的list key(比如myproject:start_urls),用lpush塞链接,多个worker会自动争抢消费目标网站不是静态文档馆,是活的防御系统。识别和绕过得组合出招,不能只靠User-Agent轮换。
scrapy.downloadermiddlewares.useragent.UserAgentMiddleware配合fake-useragent库,每次request随机挑Chrome/Firefox/Safari真实UA,同时带上Accept-Language、Accept-Encoding等配套头,模拟真人浏览器环境HttpProxyMiddleware按权重随机选可用代理scrapy-splash或改用Playwright+Scrapy结合——用无头浏览器渲染完再交给Scrapy解析,虽然慢点但稳errback里捕获412/503状态,触发识别逻辑并重试,别卡死流
程每秒几百条item入库,MySQL直连会变瓶颈,ES搜不出结果,CSV又难扩展。得按数据用途分层存。
boto3或oss2上传到阿里云OSS/腾讯COS,路径按域名+日期+hash命名(如example.com/20250520/abc123.html),保留溯源能力,不占本地磁盘logging.handlers.RotatingFileHandler按天切日志,避免单文件过大没人守着终端,爬虫就得自己会“喊人”。监控不是可选项,是生存线。
scrapy-prometheus,暴露请求数、响应状态码分布、中间件耗时等,配Grafana看板,5xx突增立刻告警queue长度、dupefilter大小、失败URL集合数量,超阈值发钉钉/企业微信消息