Python Scrapy 爬虫框架入门教程

By | 最新修改:2025-12-22
目录 显示

前言

本文主要内容

本文是面向 Python 初学者的 Scrapy 爬虫框架入门指南,旨在通过分步实战教学,帮助读者快速掌握 Scrapy 的核心使用流程。内容涵盖虚拟环境部署、框架的安装教程、创建实例项目、蜘蛛编写及数据抓取全流程,介绍如何从爬虫的响应正文提取数据,学会使用 CSS 选择器、正则表达式和 XPath 表达式,同时以 JSON Lines 格式导出到文件,最后自动化翻页获取更多的信息。本文不追求全面覆盖,聚焦基础操作,适合零基础读者快速入门网络爬虫开发。

虽然这不是一篇全面的使用教程或文档,但这是一篇用心去整理的对初学者友好的民间爬虫框架快速入门教程,尽管本文翻译整理自官方文档的初学者教程。

本文教会你以下的内容:

  1. 如何在 VirtualEnv 虚拟环境中安装 Scrapy;
  2. 创建你的第一个项目;

  3. 创建、编写和运行你的第一个蜘蛛;

  4. 进入和使用交互式控制台;

  5. 利用 response.css() 或者 response.xpath() 方法来提取网页上的元素及内容;

  6. 如何应用正则表达式来提取你想要的内容。

  7. 介绍什么是 Request(请求对象) 和 Response(响应对象);

  8. 区分 JSONJSON Lines 格式;

  9. 介绍 JSON Lines 的优势;

  10. 如何跟踪链接并且解析网页代码。

基本概念简介

Scrapy 是一款基于 Python 语言的网络爬虫工具,广泛用于网页数据爬取、API 数据获取、以及进阶应用于数据挖掘、监测和自动化测试。不愧是使用广泛、易于使用、文档齐全且功能丰富强大的爬虫系统。

它提供两种爬虫机制:Spider 和 CrawlSpider,两种机制稍有区分,略有不同。

然而,想要创建一个功能全面的蜘蛛,都离不开中间件、管道和 Items。

该框架易学习、易使用,官方资料详实。虽然它用户可能是新手,但使用它抓取到想要的数据,感受到它的便利,由此不得不说,它是抓取结构化数据的必备良品。

最新版本官方手册

本文使用的 Scrapy 版本是2.13(截止到 2025-12,为最新版本),至于各种平台和各种方式怎样安装 ,请参阅《官方用户手册》:https://docs.scrapy.org/en/2.13/intro/install.html

Python 爬虫框架的中文入门教程


系统环境和前提条件

系统环境

笔者用的机器是 Ubuntu 24.04 64位操作系统,其实只要合符于下文《前提条件》中 Python 版本的最低要求的 Linux 操作系统都可以,至于 Windows,由于篇幅原因,就不赘述,请不懂者自行百度。

前提条件

  1. 首先,你要会基本的 Python3 语法,特别是变量、列表和类的使用;
  2. 其次,你要会点 HTML 相关的知识;

  3. 再就是会操作 Linux 操作系统;

  4. 想要安装 Scrapy 当前最新版本 2.13,要求 3.9+ 的 Python 版本,这是官方手册要求的;

    检查当前操作系统的 Python3 版本:

    python3 --version
    
  5. Ubuntu 24.04 的最新系统默认软件库中,Python 版本为 v3.12.3,满足以上的条件要求。

    Ubuntu 22.04 LTS 最新的 Python 版本 3.10.12 也是合符要求的。

    理论上所有 Linux 发行版,甚至 Windows 也可以安装和使用 Scrapy。


Scrapy 虚拟环境搭建教程

什么是虚拟环境,以及其特点

“虚拟环境”是一种与操作系统上 Python 周边环境相隔离的 Python 使用方式,比如:进入“虚拟环境”后,通过 pip 命令安装的包也仅仅在当前环境中生效,而是不会影响到系统上的整体环境,也不会改变除“虚拟环境”外的任何文件和目录。

虚拟环境是 Scrapy 官方手册中建议的最佳安装方式。

Ubuntu 安装 VirtualEnv

sudo apt update
sudo apt install -y python3-virtualenv

创建

cd /path/to/scrapy-project-dir
# 本文是 /codes/code/python/scrapy
mkdir /codes/code/python/scrapy
cd /codes/code/python/scrapy
virtualenv pyenv

这里创建一个虚拟环境叫“pyenv”,随着虚拟环境的建立,当前目录下同时会有个名称为“pyenv”的目录被创建。

进入

这里说的“进入”不是进入上述的“虚拟环境目录”,而是通过一行命令进入与系统的 Python 生态环境完全相隔离的“虚拟环境”,(当前还在上述“scrapy”目录中)执行:

source pyenv/bin/activate

执行以上命令后,终端中的命令行提示符会出现类似于下图的状态:

激活 VirtualEnv 虚拟环境

首次进入“虚拟环境”,要做的第一件事是升级 PyPI 的版本,也就是 pip 命令:

pip install -U pip

这表示当前已经进入上图中红色方框框中显示的以此命名的“虚拟环境”,这里是“pyenv”。

退出

执行以下的命令即可退出 VirtualEnv 虚拟环境:

deactivate

成功执行上述命令后,看终端命令行提示符已经恢复原样。


安装 Scrapy

进入“虚拟环境”之后,执行以下命令安装命令行工具:

pip install -U scrapy

创建爬虫项目以及运行蜘蛛

本文的用例

本文会引导你如何抓取网页数据并保存数据到本地文件中。

本文的用例来自官方手册 https://docs.scrapy.org/en/latest/intro/tutorial.html

用例和代码是官方手册复制过来的,本文仅仅做的是翻译成中文,并且产生一些作者的解释,仅此而已。

若有侵权请及时联系站长进行处理:admin@icxzl.com

创建项目

要抓取数据,首先要创建一个 Scrapy 项目。

本文的前面已经说明,要在“虚拟环境”中安装和使用 Scrapy,所以首先进入“虚拟环境”。

然后是在当前目录下创建一个项目:

scrapy startproject tutorial

成功执行以上命令后,将在本目录中创建一个名为 tutorial 的目录,这是项目的根目录。

项目目录的初始结构组成

项目根目录下有一个部署爬虫的配置文件 scrapy.cfg 以及与项目同名的 Python 模块目录(其实就是编写爬虫代码所在的目录),于是默认的项目目录结构如下:

tutorial/
    scrapy.cfg            # 部署配置文件。对整个 Scrapy 项目的部署

    tutorial/             # 项目的 Python 模块,所有该项目的代码将在这个目录下生成和编写。
        __init__.py

        items.py          # 项目条目定义文件。该文件定义要抓取的信息条目

        middlewares.py    # 项目中间件文件。定义 HTTP 请求的发出和收到响应过程中的处理操作

        pipelines.py      # 项目管道文件。管道文件处理条目(Items),它定义如何保存和处理条目

        settings.py       # 项目设置文件。负责定义基本信息、并发请求数目、注册中间件和管道等等任务

        spiders/          # 稍后你将放置蜘蛛的目录。爬虫抓取的程序逻辑代码文件所在目录。
            __init__.py

实际上如下图:

Scrapy 爬虫框架的初始目录结构

创建蜘蛛(Spider)

爬虫框架中干活的是蜘蛛,所以必需创建蜘蛛代码文件,也就是在 tutorial/spiders 目录中创建一个能够抓取网上信息的代码文件。

通过命令行工具创建

通过命令行工具自动地创建你想要的蜘蛛:

scrapy genspider [options] <name> <domain>
  1. 其中 name 是爬虫项目中唯一识别名称,也就是说,项目中只能有一个这样的名称,同一项目中,别的蜘蛛是不能再起个这样的名称的。
  2. domain 为要抓取数据的网站或 API 的域名,可以是一个 HTTP URL。

  3. options 是可选的,可以过 scrapy genspider --help 查看所有支持的参数选项。

执行以下命令创建一个名为 quotes 的蜘蛛:

# 当前所有目录为: /codes/code/python/scrapy
# 进入上述目录的 tutorial 目录,这是项目的根目录,
# 以后如果没有特别的要求,默认执行 scrapy 命令的目录是此目录
cd tutorial/
# 蜘蛛目录在于当前目录的 tutorial/Spider 子目录
scrapy genspider "quotes" "https://quotes.toscrape.com/page/1/"

代码创建完成

于是,一个文件名为 quotes.py 的 Python 文件在 tutorial/Spider 目录被 scrapy genspider 命令创建了,该文件内容默认为:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    allowed_domains = ["quotes.toscrape.com"]
    start_urls = ["https://quotes.toscrape.com/page/1/"]

    def parse(self, response):
        pass

文档中的示例代码

在官方文档中,需要以下的代码:

from pathlib import Path
import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            "https://quotes.toscrape.com/page/1/",
            "https://quotes.toscrape.com/page/2/",
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = f"quotes-{page}.html"
        Path(filename).write_bytes(response.body)
        self.log(f"Saved file {filename}")

其中:

  • name:项目中的唯一识别名称;
  • start_requests():爬虫开始的目标网址,数据的抓取从这些网址开始。该方法必须返回一个可迭代的值。该可迭代的值可以返回一个包含若干 HTTP 请求列表或者生成器;
  • parse():该方法用来解析 HTTP 响应,以及发起新的请求(如果需要的话);很多时候用来处理获取的数据,并且与 Items (更多资料:https://docs.scrapy.org/en/latest/topics/items.html) 相关联。

    这是个默认的方法,当 Request 对象没有指定回调方法时就采用该方法。

    该方法的 response 参数包含爬虫的 HTTP 响应返回的相关数据,比如响应体,其中包含网页的 HTML 代码或者 API 数据。又或者是响应状态代码,如200、404等。

把上述代码复制粘贴到 tutorial/spiders/quotes.py 文件中。

更简洁的代码,做同样的事情


全文总结

本文把 Scrapy 的官方文档中的入门教程以容易理解同时使用更多注解的方式编写出来,篇章比较长,但是贵在实用。

这是个优秀的爬虫框架,使用它来爬取网站或者 API 的内容,可以省下许多不必要的代码,从而做到 Python 哲学中的“Write less code, do more”信条。

本文所接触的仅是该爬虫框架能做的其中一点点,要想学习更多,还须继续耕耘和努力。

关于所有的一切都在官方文档中,要是你想更好地使用 Scrapy,写最少的代码,做最多的事,那么有空就多看看文档,边用边学更好。

作者也是个小白,数年前接触过,并且做过一些爬虫项目,但是都没有用到这个框架真正方便的功能,因为不了解,写代码时走了不少的弯路。

最后,非常感谢你看到文章最后作者的啰嗦,祝用好!


程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com