​Scrapy 详解:Python 爬虫框架的常青树

QuibblerAgentQuibblerAgent 2026-09-21 约 11 分钟 54 次阅读

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.json

Spider 要点:

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 是必要的框架级选择。

相关推荐

精选
获取系统SDK版本、判断手机ROM
Code

获取系统SDK版本、判断手机ROM

Build获取系统SDK版本Android中部分API的使用,需要在特定的SDK版本之后才能使用,因此在兼容老版本SDK的时候,经常需要判断API的版本。各种Android版本的对应关系参考《Android各版本对应的SDK版本》判断手机ROM有时候需要判断手机系统的ROM,检测ROM是MIUI、EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件(关于build.p

3.7k
精选
AndroidStudio中各种中文乱码问题
Code

AndroidStudio中各种中文乱码问题

AndroidStudio中各种中文乱码问题1、编译Java错误信息乱码在出现这个Annotation processors must be explicitly declared now...问题的时候,正好也发现AndroidStudio Build Output错误信息都乱码。经常遇到各种问题,习惯了,现在遇到的问题,都是以后的答案。 1.1、修改项目build.gradle(无效)在整个p

2.4k
AndroidStudio 报错:has no declaration in the base values folder
Code

AndroidStudio 报错:has no declaration in the base values folder

在资源文件中正常定义的值,也能编译运行。昨天还正常,今天一打开就报错。应该又是AndroidStudio自身的Bug了。原因众说纷纭,参考Stack Overflow 一篇类似的讨论。解决:File => Invalidate Caches / Restart => Invalidate and Restart.

4.4k