Scrapy 详解:Python 爬虫框架的常青树
从网页里抽取结构化数据,是数据采集的刚需。自己用 requests 手写,很快就会撞上并发调度、重试、去重、限速、清洗落库一连串工程问题。scrapy/scrapy(Scrapy)把这些全部打包成框架:Spider 类专注解析逻辑,引擎、调度器、下载器在底层并发运转,管线负责清洗与存储。约 64.3k Star、BSD 协议、Zyte 商业支持,Python 爬虫领域的常青树。本文从架构、快速上手、核心组件到工程实践,完整拆解。
1、项目概述
Scrapy 是一个跨平台的网页抓取框架,用于从网站提取结构化数据,要求 Python 3.10+,由 Zyte(原 Scrapinghub)与社区共同维护。仓库约 64.3k Star、11.9k Fork,BSD-3-Clause 协议。
核心特性:
- Spider 类承载爬取逻辑,解析与调度分离
- 选择器同时支持 CSS 与 XPath
- Item Pipeline 做数据后处理,中间件挂钩请求全流程
- 异步并发下载,内置 JSON / JSONL / CSV / XML / Pickle 导出
2、架构:六大组件如何协作
理解 Scrapy 的关键是它的数据流:引擎居中调度,其余组件各司其职。
六大组件:
- 引擎(Engine):协调所有组件、驱动数据流动的总指挥
- 调度器(Scheduler):请求队列,负责排队与优先级
- 下载器(Downloader):抓取页面并把响应交回引擎
- Spiders:用户编写的解析类,从响应中产出数据或新请求
- Item Pipeline:清洗、校验、存储抓到的数据
- 中间件(Downloader / Spider Middlewares):挂钩请求与响应的处理过程
数据流四步:
1. 引擎从 Spider 取初始请求,交给调度器排队
2. 调度器弹出请求,经下载中间件送达下载器抓取
3. 响应回到 Spider,parse 里 yield 出条目或后续请求
4. 条目流经 Pipeline 层层加工后落库,新请求再入队
3、安装与快速上手
一条 pip 装好框架,两条命令建出项目骨架与首个爬虫。
// 安装(需 Python 3.10+)
pip install scrapy
// 创建项目骨架
scrapy startproject myproject
cd myproject
// 生成一个针对 example.com 的爬虫模板
scrapy genspider example example.com上手要点:
1. startproject 生成含 spiders 目录与 settings.py 的标准结构
2. genspider 按"名字 + 域名"生成爬虫类模板,改 parse 即可开跑
3. scrapy list 可查看当前项目全部爬虫
4. 运行见下一节的 crawl 命令
4、编写第一个 Spider
Spider 只需定义名字、起始 URL 与 parse 方法:解析响应、yield 数据、跟进下一页,一个类完成整站抓取。
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ["https://quotes.toscrape.com/"]
def parse(self, response):
for quote in response.css("div.quote"):
yield {
"text": quote.css("span.text::text").get(),
"author": quote.css("small.author::text").get(),
}
next_page = response.css("li.next a::attr(href)").get()
if next_page:
yield response.follow(next_page, self.parse)
// 运行并导出 JSON
// scrapy crawl quotes -o quotes.jsonSpider 要点:
1. name 是爬虫唯一标识,crawl 命令按它启动
2. response.css 里 ::text 与 ::attr(href) 直接取出文本与属性
3. yield 字典即产出条目,yield response.follow 即发起下一页请求
4. -o quotes.json 一条命令落盘,自动翻页直到没有下一页
5、Scrapy Shell:先验证选择器再写代码
写 Spider 前先在交互控制台里试选择器,是 Scrapy 工作流的黄金习惯。
// 打开交互控制台(自动抓取目标页)
scrapy shell "https://quotes.toscrape.com/"
// 在控制台里验证 CSS 与 XPath 两种写法
>>> response.css("title::text").get()
>>> response.xpath("//h2/text()").get()Shell 要点:
1. 页面只抓一次,反复调试选择器不再重复请求
2. CSS 不通就换 XPath,两者可混用互验
3. get 取首个、getall 取全部,验证无误再搬进 Spider
4. 对比浏览器开发者工具的元素面板,定位更直观
6、工程化:管线、中间件与限速
从 Demo 到生产,靠的是 Pipeline、中间件与设置调优这三件套。
工程化三件套:
- Item Pipeline:去重、清洗字段、校验必填、写数据库,逐级链式处理
- 下载中间件:挂代理、随机 UA、重试与超时控制;Spider 中间件处理响应进入解析前
- 设置项:并发数、下载延迟、自动限速(AutoThrottle)、缓存与重试策略
实践要点:
1. 解析只管产出原始条目,清洗与校验全部下沉到 Pipeline
2. 面向目标站开启 AutoThrottle,避免把对方打挂也保护自己
3. 反爬严格的站配代理池中间件与 UA 轮换
4. 大规模采集交给 Scrapy Cloud(Zyte)或自建调度平台部署
7、使用建议与注意事项
使用建议:
- 单页小需求用 requests + BeautifulSoup 更轻;整站、分页、增量采集用 Scrapy
- 动态渲染页面可接 Playwright 中间件,或抓接口绕过渲染
- 遵守 robots.txt 与目标站条款,控制抓取频率
- 官方文档 docs.scrapy.org 极其完善,疑难先查文档
注意事项:
- Python 需 3.10 及以上,旧环境先升级
- Windows 安装依赖若报编译错误,用官方推荐的预编译轮子
- 默认并发较激进,生产前在 settings.py 调低并发、加延迟
- 数据敏感场景注意遵守目标网站的版权与隐私边界
8、总结
Scrapy 是 Python 生态最成熟的网页抓取框架(64.3k Star、BSD 协议、Zyte 支持),以引擎、调度器、下载器、Spider、Pipeline、中间件六大组件构成异步并发的采集引擎;CSS / XPath 双选择器、Scrapy Shell 交互调试、一条命令导出多格式数据,从 Demo 到生产(管线清洗、中间件挂代理、AutoThrottle 限速、Scrapy Cloud 部署)路径完整。
落地建议:有整站抓取、分页跟进、增量采集需求的团队,用 startproject 建骨架、Shell 验证选择器、Spider 里 yield 数据与请求、Pipeline 负责清洗落库,再按目标站情况调并发与限速。对于把网页数据变成结构化资产的任务,Scrapy 是必要的框架级选择。

