Scrapy:Python 生态最经典的爬虫框架部署与最小示例
一、项目简介与定位
Scrapy 是一个用纯 Python 编写的开源 Web 抓取与网页爬取框架,定位是"从网站中提取结构化数据"的全流程基础设施。它不是一个函数库,而是一套包含引擎、调度器、下载器、Spider、Item Pipeline、中间件的完整流水线,由 Zyte(原 Scrapinghub)维护,自 2008 年开源以来一直是 Python 爬虫领域事实上的工业标准。
Scrapy 内置异步 IO、自动去重、重试、 robots.txt 遵守、Cookie 与会话管理、导出 JSON/CSV/XML 等能力,适合做站点级数据采集、价格监控、舆情抓取、搜索引擎索引构建等任务。
二、开源协议
Scrapy 采用 BSD 3-Clause "New" 或 "Revised" License,商业与非商业项目均可自由使用、修改和再分发,仅需保留版权声明与免责条款。
三、官方仓库链接
四、前置要求
根据官方 README,Scrapy 当前版本要求:
- Python 3.11 及以上(跨平台,支持 Linux / macOS / Windows)
- 可用的
pip包管理器 - 系统级依赖(Debian/Ubuntu
常见):
build-essential libssl-dev libffi-dev python3-dev,用于编译 lxml、cryptography 等带 C 扩展的依赖
五、安装部署
官方 README 给出的安装命令:
pip install scrapy安装完成后,命令行工具 scrapy 即可使用:
scrapy version建议在虚拟环境中安装:
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install scrapy六、最小示例代码
6.1 创建项目
scrapy startproject demo_spider
cd demo_spider目录结构(Scrapy 自动生成):
demo_spider/
├── scrapy.cfg
└── demo_spider/
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders/
└── __init__.py6.2 编写第一个 Spider
新建 demo_spider/spiders/quotes_spider.py:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
"https://quotes.toscrape.com/page/1/",
]
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 is not None:
yield response.follow(next_page, callback=self.parse)6.3 运行并导出结果
scrapy crawl quotes -o quotes.json-o 参数支持
json、jsonlines、csv、xml
等格式,Scrapy 会自动把 Spider yield 出来的 Item
序列化落盘。
6.4 定义 Item 与 Pipeline(可选)
items.py:
import scrapy
class QuoteItem(scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()pipelines.py:
class QuotePipeline:
def process_item(self, item, spider):
# 在这里做清洗、入库、写数据库
return item在 settings.py 中启用:
ITEM_PIPELINES = {
"demo_spider.pipelines.QuotePipeline": 300,
}七、配置项
常用配置(位于 settings.py):
| 配置项 | 含义 | 默认值 |
|---|---|---|
ROBOTSTXT_OBEY |
是否遵守 robots.txt | True |
CONCURRENT_REQUESTS |
全站并发请求数 | 16 |
DOWNLOAD_DELAY |
同一站点两次请求之间的延时(秒) | 0 |
USER_AGENT |
请求 UA | Scrapy 自带 UA |
DEFAULT_REQUEST_HEADERS |
全局请求头 | 空 |
ITEM_PIPELINES |
Item 处理流水线 | 空 |
LOG_LEVEL |
日志级别 | DEBUG |
生产环境强烈建议:
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 1.0
CONCURRENT_REQUESTS_PER_DOMAIN = 4
USER_AGENT = "demo_spider (+https://example.com/contact)"八、常见问题
pip install scrapy时报 lxml / cryptography 编译失败 Debian/Ubuntu 先装系统依赖:sudo apt install build-essential libssl-dev libffi-dev python3-dev,再重试。爬下来的页面是 JS 渲染后的空壳 Scrapy 自带下载器不执行 JavaScript。需要 JS 渲染时,配合
scrapy-playwright或scrapy-splash(Splash 服务)使用。被目标站封 IP 降低
CONCURRENT_REQUESTS_PER_DOMAIN、加大DOWNLOAD_DELAY、设置真实USER_AGENT,必要时通过DOWNLOADER_MIDDLEWARES接入代理池。response.css()选不到元素 先用scrapy shell <url>进入交互式终端,在浏览器里拷贝真实选择器,避免凭印象写。Windows 上安装时报
Microsoft Visual C++ 14.0 is required安装 Microsoft C++ Build Tools,或直接使用官方提供的预编译 wheel。
九、与同类工具对比
- vs. requests + BeautifulSoup:requests/BS 是"手搓"方案,灵活但要自己写调度、去重、重试、并发;Scrapy 把这些都封装好了,适合多页、多站点、长期运行的采集任务。
- vs. pyspider:pyspider 提供 Web UI 在线编辑脚本,上手快但项目已多年未活跃;Scrapy 是工程化框架,适合版本管理、CI/CD、团队协作。
- vs. Colly(Go):Colly 性能更高、内存更省,但生态与中间件不如 Scrapy 丰富;Python 团队选 Scrapy,追求单机高吞吐可考虑 Colly。
- vs. Crawlee / Playwright:新一代反检测能力更强,但需要 Node.js 栈;Scrapy 仍是 Python 生态最成熟的选择。
十、许可
本项目基于 BSD 3-Clause 许可证发布。详情见仓库根目录
LICENSE 文件。
十一、责任使用声明
- 抓取前务必查看目标站点的
robots.txt与服务条款(ToS),仅采集明确允许公开访问的页面。 - 通过
DOWNLOAD_DELAY、CONCURRENT_REQUESTS_PER_DOMAIN等参数控制并发并加入合理延时,避免对目标服务器造成压力。 - 不要绕过登录态、付费墙、验证码或反爬机制去获取本应对付费用户或授权用户开放的内容。
- 不批量抓取、汇总或再分发涉及个人隐私的数据(手机号、身份证号、住址、通讯录等)。
- 本框架仅用于公开数据采集、学术研究与合法的商业情报分析,使用方自行承担合规责任。
- 尊重原作者版权,抓取到的正文、图片、音视频内容在二次发布时应注明来源并遵守相应许可协议。