Scrapy 2.18:一个把爬虫写成工程的 Python 框架,而不是脚本
Scrapy,一个用于 Python 的快速高级网络爬行和抓取框架。
秒懂
- 它是什么?
- Scrapy 是 Python 生态里最老牌的爬虫框架之一,最新 2.18.0 要求 Python 3.10+。它把请求调度、解析、导出和去重都做成了框架内置的组件,适合需要长期维护的采集项目,但对付现代前端渲染的网站时,你得自己补上浏览器那一段。
- 适合谁用?
- 如果你要采集的网站结构稳定、数据量大、需要定时调度和结构化输出,Scrapy 值得采用。它把请求重试、并发控制、去重和导出都内置了,省去你自己组装这些部件的时间。
- 能商用吗?
- 可以。BSD-3-Clause 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 1 天前。
- 用什么语言写的?
- 主要是 Python(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决的不是抓取,而是抓取之后的工程问题
用 Requests 写一个爬虫,你得到的是一个循环加一个解析函数。用 Scrapy,你得到的是一个项目骨架:Spider 负责解析,Item 定义数据字段,Pipeline 处理清洗和存储,Downloader 管理并发和重试。这个框架解决的问题不是怎么发出 HTTP 请求,而是怎么让你的爬虫在跑一个月之后还能改、还能加字段、还能换存储目标。它的 README 第一句话就说这是一个 web scraping framework,不是库。这个区别是实质性的。框架会约束你的代码组织方式,换来的是组件之间的标准接口。适合的团队是那些把采集当作长期数据管道一部分的人,而不是临时抓一次数据的个人开发者。
从请求到 Item:框架内部的固定流程
Scrapy 的核心是一个异步引擎。你定义 Spider 类,里面写 start_requests 方法生成初始请求,或者直接写 start_urls 列表。每个响应回来之后,框架调用你写的 parse 方法,你从中提取数据,返回 Item 或者新的 Request。这些 Request 会进入调度器,经过去重过滤器,再交给下载器。下载器支持并发,默认的并发数可以通过配置文件调整。响应经过 Downloader Middleware,可以加代理、加随机 User-Agent、处理重试。Item 出来后经过 Item Pipeline,你可以在这里做数据校验、去重、写数据库或者导出 JSON。整个流程是固定的,你不需要自己写线程池或者队列。这个设计的好处是,你写的每个组件都是独立的,测试单个 Pipeline 或 Middleware 比测试一个脚本容易得多。
安装和第一个项目:两条命令就够了
安装是标准的 pip 流程,README 里给的命令是 pip install scrapy。装完之后,你通常需要创建一个项目,虽然 README 没有写,但根据框架的常规用法,你会运行 scrapy startproject 来生成目录结构。这个目录里会有 spiders 文件夹、items.py、pipelines.py、settings.py。settings.py 里你可以配置 CONCURRENT_REQUESTS、DOWNLOAD_DELAY、ROBOTSTXT_OBEY 这些键。运行一个爬虫用 scrapy crawl spider_name。输出格式通过 -o 参数指定,比如 scrapy crawl quotes -o quotes.json。这些命令在官方文档里有详细说明,但 README 只给了安装命令。实际使用时,你会发现框架的脚手架比手写脚本多了一层抽象,但换来的是项目结构的一致性。
一个明显的局限:它不渲染 JavaScript
Scrapy 的下载器只处理原始的 HTTP 响应。它不会执行 JavaScript,也不会渲染 DOM。现在很多网站的内容是 React 或 Vue 应用,数据通过 XHR 接口加载,HTML 里只有空壳。这种情况下,Scrapy 直接抓到的页面没有内容。解决方案是集成 Splash 或者 Selenium,但这是额外的工作,你需要自己写 Middleware 来驱动浏览器。这个框架本身没有内置无头浏览器支持,这是它的一个真实边界。如果你的目标网站大量使用前端渲染,Scrapy 的异步优势会被浏览器启动的开销抵消。这种情况下,你可能更适合直接用 Playwright 写脚本,而不是在 Scrapy 里套一层浏览器。
对比 Requests + BeautifulSoup:脚本与框架的分界线
最简单的替代方案是 Requests 加 BeautifulSoup。Requests 发请求,BeautifulSoup 解析 HTML,逻辑全写在一个脚本里。这个方案的优势是零学习成本,代码量少,适合一次性任务。Scrapy 的优势在于它内置了去重、重试、并发和导出,这些在脚本里你得自己实现。例如,Requests 脚本里你要自己维护一个已访问 URL 的集合,自己处理重试异常,自己写 CSV 导出。Scrapy 把这些都做成了配置项。分界线在于项目的生命周期。如果你的爬虫只跑一次,脚本更合适。如果要跑几个月,Scrapy 的工程化结构会让维护成本明显降低。另一个区别是 Scrapy 有 Item Pipeline 的概念,你可以把清洗逻辑和抓取逻辑分开,这在脚本里很难做到。
维护与升级成本:活跃但需要跟进
Scrapy 的发布节奏是稳定的。2026 年 8 月发布了 2.18.0,7 月是 2.17.0,5 月是 2.16.0,大约每两个月一个小版本。这说明项目在持续维护,但也意味着你要留意版本变化。小版本升级通常不破坏 API,但依赖的底层库可能会变。Scrapy 依赖 Twisted 框架,Twisted 的升级有时会带来行为变化。对于长期运行的项目,你需要把升级纳入计划,不能一直停在旧版本。许可证是 BSD-3-Clause,这是宽松许可,你可以自由使用和修改,甚至用于商业项目,只要保留版权声明。不需要担心开源病毒的问题。
编辑结论
如果你要采集的网站结构稳定、数据量大、需要定时调度和结构化输出,Scrapy 值得采用。它把请求重试、并发控制、去重和导出都内置了,省去你自己组装这些部件的时间。但如果你只是临时抓一页数据,或者目标网站大量依赖 JavaScript 渲染,Scrapy 反而显得笨重,你得更适合用 Requests 加一个无头浏览器。采用前先确认两件事:目标站点是否允许爬虫,以及你的 Python 版本是否在 3.10 以上。Scrapy 的主分支持续在更新,2.18.0 是 2026 年 8 月发布的,说明它还在活跃维护,但这也意味着你需要跟上版本节奏,否则旧项目可能因为依赖变化而出现兼容问题。
社区笔记