Scrapy五大核心组件详解 - 五脏六腑怎么协同干活?
大家好呀,我是道满PythonAI!上一篇我们搞懂了为什么选Scrapy(异步、高并发、扩展性强),今天直接把它拆开来学——核心5件套不神秘,看完你就明白 Scrapy 怎么能“快、稳、巧”地爬数据!
📂 所属阶段:第一阶段 — 初出茅庐(框架核心篇)
🔗 相关章节:为什么选择 Scrapy? · 创建你的首个工程
目录
- 1分钟看全局架构
- Engine(核心指挥家)
- Scheduler(任务调度管家)
- Downloader(内容搬运工)
- Spiders(解析逻辑师)
- Pipeline(数据加工厂)
- 完整协同工作流(必看!)
- 优化小锦囊
- 常见问题快答
1分钟看全局架构
Scrapy 采用事件驱动异步架构,5 个核心组件各司其职,Engine 充当“总指挥”串联所有环节,自动形成一条数据流水线:
极简数据流向
你只需要在 Spider 里写“解析什么、怎么跟新链接”,剩下的调度、下载、存库都由框架搞定。
Engine(核心指挥家)
Engine 是 Scrapy 的“大脑”,它不干具体的爬取活儿,但决定所有组件“什么时候、做什么、交给谁”。
核心职责
- 事件循环驱动:利用 Twisted 异步库接管整个流程的执行节奏
- 组件生命周期管理:启动、运行、暂停、停止爬虫
- 信号分发与处理:协调组件之间的状态通知
- 数据流转监控:保证 Requests / Responses / Items 在组件间正确传递
常用生命周期信号
配置注意
这些参数能帮你控制抓取规模和资源消耗,避免无限运行。
Scheduler(任务调度管家)
Scheduler 是“仓库管理员 + 优先级经理”,专门管理待爬的 Requests 队列,做到去重、排队、续爬三大功能。
核心功能
- 去重:默认使用
RFPDupeFilter生成请求指纹(哈希值),判断是否爬过 - 排队:支持 FIFO / LIFO / 优先级队列,默认先进先出
- 持久化:设置
JOBDIR后,中断的任务可以从断点续爬!
配置与技巧
自定义去重(简单版)
Downloader(内容搬运工)
Downloader 是“高速快递员”,负责发送 HTTP 请求、接收响应,靠着连接复用、自动限速和下载器中间件,稳稳地把网页搬回来。
核心子系统
- 下载器中间件(Downloader Middleware):拦截 Requests / Responses,可以修改 User-Agent、设置代理、处理重定向和重试
- 连接池:复用 TCP 连接,减少三次握手开销
- 自动限速器(AutoThrottle):根据目标网站的响应速度动态调整请求延迟
生产级配置
Spiders(解析逻辑师)
Spiders 是唯一需要你写业务逻辑的地方!在这里定义起始 URL,解析 HTTP 响应,产出新请求和 Item 数据。
最常用的两种 Spider
scrapy.Spider:灵活轻量,适合定制化提取逻辑CrawlSpider:配合Rule+LinkExtractor可自动发现链接,适合全站爬取
Basic Spider 最简示例
要点:yield 新请求就交给 Engine 继续调度,yield 字典则会被转换成 Item 并经过 Pipeline 管道。
Pipeline(数据加工厂)
Pipeline 是“质检 + 仓储流水线”,对 Spider 产出的 Items 进行清洗、验证、去重,然后安全地存到数据库或文件。
Pipeline 的生命周期
每个 Pipeline 至少要实现以下两个方法之一(更多可选):
open_spider(self, spider):爬虫启动时执行(如初始化 MySQL 连接)process_item(self, item, spider):必写! 处理每个 Item,返回 Item(或抛出DropItem丢弃)close_spider(self, spider):爬虫停止时执行(如关闭连接)
执行顺序的配置
完整协同工作流(必看!)
7 步走通整个流程
-
初始化
启动爬虫 → Engine 加载 Spider → Scheduler 初始化队列 → Downloader 准备连接池 -
发起起始请求
Spider 生成start_urls→ Engine 转发给 Scheduler → Scheduler 去重后入队 -
取请求
Engine 从 Scheduler 取优先级最高的 Request → 转发给 Downloader -
下载
Downloader 发送 HTTP 请求 → 拿到响应 → 交给 Engine -
解析
Engine 将响应发给 Spider 对应的callback→ Spider 解析出新 Requests 和 Items -
循环与存储
- 新 Requests → Engine → Scheduler → 重复步骤 3‑5
- Items → Engine → 按顺序执行所有 Pipeline → 存入目标位置
-
停止
Scheduler 队列为空且没有新的 Request 生成 → Engine 关闭所有组件 → 爬虫结束
优化小锦囊
性能优化
- 合理设置并发:全局
16~64,单域名2~8,别太高以防被封 - 必开自动限速:
AUTOTHROTTLE_ENABLED = True,让框架自适应 - 复用中间件逻辑:不要把反爬代码全堆在 Spider 里,抽到中间件更便于维护
内存优化
- 及时丢弃无效 Item:在 Pipeline 中不满足条件就
raise DropItem - 限制爬取规模:用
CLOSESPIDER_TIMEOUT、CLOSESPIDER_PAGECOUNT、CLOSESPIDER_ITEMCOUNT控制
常见问题快答
Q1: Spider 怎么传参数给 Pipeline?
A: 可以直接用 spider.settings.get(),或在 Spider 里定义自定义属性(如 spider.custom_param),Pipeline 里通过 spider 对象访问。
Q2: 怎么续爬中断的任务?
A: 在 settings.py 中设置 JOBDIR = 'crawls/xxx/',爬虫启动后会保存中间状态,中断后使用相同命令重新启动即可续爬!
Q3: 怎么让详情页比列表页优先爬取?
A: 生成详情页 Request 时添加 priority=5(默认列表页优先级为 0 或 1,数字越大越优先),调度器会按优先级出队。
🏷️ 标签云: Scrapy 核心组件 Engine Scheduler Downloader Spiders Pipeline 爬虫架构 数据采集

