Scrapy负责解析与调度,Redis实现去重和共享请求队列,Kafka作为可靠数据管道传输结构化数据;三者通过中间件解耦,分工明确。
核心思路是:Scrapy 负责页面解析和请求调度,Redis 做任务队列和去重,Kafka 承担数据管道角色,把清洗后的结构化数据可靠地传给下游(比如数据库、ES 或实时计算系统)。三者不直接耦合,靠中间件桥接,分工明确。
不是存网页源码,而是管两件事:去重指纹(dupefilter) 和 共享请求队列(scheduler)。Scrapy-Redis 提供了可替换的 DUPEFILTER_CLASS 和 SCHEDULER 类,让多个 Scrapy 实例共用同一个 Redis 实例的 set 和 zset 结构。注意:Redis 不做任务状态追踪(比如“正在处理”),它只保证不重复入队、按优先级出队。
写一个自定义 pipeline,继承 scrapy.pipelines.Pipeline,在 process_item 方法里用 confluent-kafka 或 kafka-python 把 item 序列化后发到指定 topic。关键细节:
靠 Redis 队列 + 合理配置实现自然负载均衡。所有 Scrapy 实例共用同一套 SCHEDULER_QUEUE_KEY,谁空闲谁从队列 pop 请求。但要注意:
s 的 Spider 子类(如 RedisSpider),它会自动监听 Redis 中的 start_urls