Loading...

文章背景图

Scrapy:Python 生态最经典的爬虫框架部署与最小示例

2026-11-06
0
- 字
- 分钟
|

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__.py

6.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)"

八、常见问题

  1. pip install scrapy 时报 lxml / cryptography 编译失败 Debian/Ubuntu 先装系统依赖:sudo apt install build-essential libssl-dev libffi-dev python3-dev,再重试。

  2. 爬下来的页面是 JS 渲染后的空壳 Scrapy 自带下载器不执行 JavaScript。需要 JS 渲染时,配合 scrapy-playwright 或 scrapy-splash(Splash 服务)使用。

  3. 被目标站封 IP 降低 CONCURRENT_REQUESTS_PER_DOMAIN、加大 DOWNLOAD_DELAY、设置真实 USER_AGENT,必要时通过 DOWNLOADER_MIDDLEWARES 接入代理池。

  4. response.css() 选不到元素 先用 scrapy shell <url> 进入交互式终端,在浏览器里拷贝真实选择器,避免凭印象写。

  5. 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 等参数控制并发并加入合理延时,避免对目标服务器造成压力。
  • 不要绕过登录态、付费墙、验证码或反爬机制去获取本应对付费用户或授权用户开放的内容。
  • 不批量抓取、汇总或再分发涉及个人隐私的数据(手机号、身份证号、住址、通讯录等)。
  • 本框架仅用于公开数据采集、学术研究与合法的商业情报分析,使用方自行承担合规责任。
  • 尊重原作者版权,抓取到的正文、图片、音视频内容在二次发布时应注明来源并遵守相应许可协议。
评论交流

文章目录