Scrapy 五大核心组件:Engine、Scheduler、Downloader、Spiders、Pipeline

📂 所属阶段:第一阶段 — 初出茅庐(框架核心篇)
🔗 相关章节:为什么选择 Scrapy? · 创建你的首个工程


1. 架构图

┌─────────────────────────────────────────────────────┐
│                    Scrapy Engine                     │
│                   (事件循环中心)                      │
└─────────────────────────────────────────────────────┘
         ↑                    ↓                    ↑
    Scheduler          Downloader            Spiders
   (请求队列)         (网络请求)            (解析逻辑)
         ↑                    ↓                    ↑
    去重集合          响应处理                 Item
         ↑                    ↓                    ↑
         └────────────────────┴────────────────────┘

                    Pipeline
                  (数据处理)

                   数据库/文件

2. 五大组件详解

2.1 Engine(引擎)

"""
Engine = 事件循环中心

职责:
  - 协调各个组件
  - 处理信号
  - 管理爬虫生命周期
"""

# Engine 的工作流
# 1. 启动爬虫
# 2. 从 Scheduler 获取请求
# 3. 发送给 Downloader
# 4. 接收响应
# 5. 发送给 Spider
# 6. 获取 Item
# 7. 发送给 Pipeline
# 8. 重复 2-7,直到没有请求

2.2 Scheduler(调度器)

"""
Scheduler = 请求队列管理

职责:
  - 存储待爬取的请求
  - 去重(防止重复爬取)
  - 优先级排序
"""

# 默认使用内存队列
# 分布式爬虫使用 Redis 队列

2.3 Downloader(下载器)

"""
Downloader = 网络请求执行

职责:
  - 发送 HTTP 请求
  - 接收响应
  - 处理网络错误
"""

# 基于 Twisted 的异步网络库
# 支持并发请求(默认 16 个)

2.4 Spiders(爬虫)

"""
Spiders = 爬取逻辑

职责:
  - 定义起始 URL
  - 解析响应
  - 提取数据
  - 生成新请求
"""

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://example.com']
    
    def parse(self, response):
        # 解析响应
        for item in response.css('div.item'):
            yield {
                'title': item.css('h2::text').get(),
                'price': item.css('span.price::text').get(),
            }

2.5 Pipeline(管道)

"""
Pipeline = 数据处理

职责:
  - 数据清洗
  - 数据验证
  - 数据存储
"""

class MyPipeline:
    def process_item(self, item, spider):
        # 清洗数据
        item['title'] = item['title'].strip()
        
        # 验证数据
        if not item['price']:
            raise DropItem("Missing price")
        
        # 存储数据
        self.save_to_db(item)
        
        return item

3. 完整工作流

1. Engine 启动爬虫

2. Spider 返回起始请求

3. Engine 将请求发送给 Scheduler

4. Scheduler 去重并排序

5. Engine 从 Scheduler 获取请求

6. Engine 将请求发送给 Downloader

7. Downloader 发送 HTTP 请求

8. Downloader 接收响应

9. Engine 将响应发送给 Spider

10. Spider 解析响应,返回 Item 或新请求

11. Engine 将 Item 发送给 Pipeline

12. Pipeline 处理 Item

13. 重复 4-12,直到没有请求

14. Engine 关闭爬虫

4. 小结

五大组件协同工作:

Engine(中心)

Scheduler(队列)→ Downloader(网络)→ Spider(解析)

Pipeline(存储)

理解这个流程,你就理解了 Scrapy 的核心!

💡 记住:Scrapy 的强大之处在于这五个组件的完美协作。每个组件都可以自定义,这就是 Scrapy 的灵活性所在。


🔗 扩展阅读