#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 的灵活性所在。
🔗 扩展阅读

