Scrapy负责解析与调度,Redis实现去重和共享请求队列,Kafka作为可靠数据管道传输结构化数据;三者通过中间件解耦,分工明确。

Scrapy + Redis + Kafka 分布式爬虫怎么搭
核心思路是:Scrapy 负责页面解析和请求调度,Redis 做任务队列和去重,Kafka 承担数据管道角色,把清洗后的结构化数据可靠地传给下游(比如数据库、ES 或实时计算系统)。三者不直接耦合,靠中间件桥接,分工明确。
Redis 在分布式里起什么作用
不是存网页源码,而是管两件事:去重指纹(dupefilter) 和 共享请求队列(scheduler)。Scrapy-Redis 提供了可替换的 DUPEFILTER_CLASS 和 SCHEDULER 类,让多个 Scrapy 实例共用同一个 Redis 实例的 set 和 zset 结构。注意:Redis 不做任务状态追踪(比如“正在处理”),它只保证不重复入队、按优先级出队。
- 启动前确保 Redis 开启 AOF 持久化,防断电丢任务
- dupefilter 的 key 建议加项目前缀,比如 red">myproject:dupefilter,避免多项目混用冲突
- 如果爬取频率高,把 REDIS_URL 指向 Redis 集群代理(如 Twemproxy 或 Codis),别直连单点
Kafka 怎么接入 Scrapy 管道
写一个自定义 pipeline,继承 scrapy.pipelines.Pipeline,在 process_item 方法里用 confluent-kafka 或 kafka-python 把 item 序列化后发到指定 topic。关键细节:
- 不要在 pipeline 里阻塞等待 ack,设 delivery.timeout.ms=30000 并配好重试逻辑
- item 字段含中文时,用 json.dumps(..., ensure_ascii=False),再 encode('utf-8')
- 建议每个爬虫项目对应独立 topic,比如 spider-news-items,方便下游按需订阅
怎么协调多个爬虫节点不打架
靠 Redis 队列 + 合理配置实现自然负载均衡。所有 Scrapy 实例共用同一套 SCHEDULER_QUEUE_KEY,谁空闲谁从队列 pop 请求。但要注意:
立即学习“Python免费学习笔记(深入)”;
- 禁用 Scrapy 默认的内存去重(DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter')
- 关闭 ROBOTSTXT_OBEY = False,否则不同节点可能因 robots 协议行为不一致导致漏页
- 用 scrapy-redis 的 Spider 子类(如 RedisSpider),它会自动监听 Redis 中的 start_urls











