1. 前言
1.1. 本文的主要内容
本文是面向 Python 初学者的 Scrapy 爬虫框架入门指南,旨在通过分步实战教学,帮助读者快速掌握 Scrapy 的核心使用流程。内容涵盖虚拟环境部署、框架的安装教程、创建实例项目、蜘蛛编写及数据抓取全流程,并附详细代码示例与官方资源指引。本文不追求全面覆盖,聚焦基础操作,适合零基础读者快速入门网络爬虫开发。
实话说,这并不是一篇全面的 Scrapy 教程或文档,本文仅仅涉及到基本的使用,用于入门学习的爬虫教程。
阅读完本文,您将学会以下的知识:
- 在 VirtualEnv 中安装 Scrapy;
-
创建你的第一个爬虫项目;
-
用不同的代码逻辑创建、编写和运行你的第一个 Scrapy 爬虫。
1.2. 基本概念简介
Scrapy 是一款基于 Python 语言的网络爬虫工具,广泛用于网页数据爬取、API 数据获取、以及进阶应用于数据挖掘、监测和自动化测试。不愧是使用广泛、易于使用、文档齐全且功能丰富强大的爬虫系统。
它提供两种爬虫机制:Spider 和 CrawlSpider,两种机制稍有区分,略有不同。
然而,想要创建一个功能全面的蜘蛛,都离不开中间件、管道和 Items。
2. 系统环境和前提条件
2.1. 系统环境
笔者用的机器是 Ubuntu 24.04 64位操作系统,其实只要合符于下文《前提条件》中 Python 版本的最低要求的 Linux 操作系统都可以,至于 Windows,由于篇幅原因,就不赘述,请不懂者自行百度。
2.2. 前提条件
- 首先,你要会基本的 Python3 语法,特别是变量、列表和类的使用;
-
其次,你要会点 HTML 相关的知识;
-
再就是会操作 Linux 操作系统;
-
想要安装 Scrapy 当前最新版本 2.13,要求 3.9+ 的 Python 版本,这是官方手册要求的;
检查当前操作系统的 Python3 版本:
python3 --version
- Ubuntu 24.04 的最新系统默认软件库中,Python 版本为 v3.12.3,满足以上的条件要求。
Ubuntu 22.04 LTS 最新的 Python 版本 3.10.12 也是合符要求的。
3. Scrapy 虚拟环境搭建教程
本文采用一种叫“虚拟环境”(virtual environment)的方式安装 Scrapy,使用 VirtualEnv 作为创建和管理“虚拟环境”的工具。
这一部分是 Scrapy 爬虫项目创建步骤的第一步,也就是创建运行环境,一个经过隔离且不影响外界的环境。
3.1. 什么是虚拟环境,以及其特点
“虚拟环境”是一种与操作系统上 Python 周边环境相隔离的 Python 使用方式,比如:进入环境后,通过 pip
命令安装的包也仅仅在当前环境中生效,而是不会影响到系统上的整体环境,也不会改变外面的任何文件和目录。
这种安装 PyPI 包的形式是文档中建议的最佳安装方式。
3.2. 安装 VirtualEnv
本章节用一个 Bash Shell 脚本来兼容地安装了 PyPI 以及使用它来安装 VirtualEnv。
该脚本兼容了大部分的 Linux 发行版,如果您的操作系统不使用 dnf、yum 或 apt 作为软件安装管理器,也可自己先安装 Python3 的 PyPI(pip),然后再执行下面的脚本,这不影响对 VirtualEnv 正确的安装。
Linux 下安装 VirtualEnv 的通用脚本如下(支持 Ubuntu 系列,RHEL 系列,以及其他使用 apt,yum, dnf 的 Linux 操作系统):
echo 'sudo dnf install -y python3-pip
sudo yum install -y python3-pip
sudo apt install -y python3-pip
# Python PyPI 国内源
python3 -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
sudo python3 -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
cat /etc/os-release | grep "24.04"
if [ $? -eq 0 ]; then
sudo python3 -m pip install -U pip --break-system-packages
sudo python3 -m pip install -U virtualenv --break-system-packages
else
sudo python3 -m pip install -U pip
sudo python3 -m pip install -U virtualenv
fi'>/tmp/installer.sh
bash /tmp/installer.sh
rm -f /tmp/installer.sh
3.3. 使用 VirtualEnv
创建一个虚拟环境,命令格式是 virtualenv <目录名>
。
3.3.1. 创建 Python 虚拟环境
cd /path/to/scrapy-project-dir
# 本文是 /codes/code/python/scrapy
mkdir -p /codes/code/python/scrapy
cd /codes/code/python/scrapy
virtualenv pyenv
当前目录下会有个名称为“pyenv”的目录被创建。
3.3.2. 进入 VirtualEnv
这里说的“进入”不是进入上述的目录,而是通过一行命令进入与系统的 Python 生态环境完全相隔离的环境,(当前还在上述“scrapy”目录中)执行:
# Bash Shell
source pyenv/bin/activate
# Fish Shell
source pyenv/bin/activate.fish
执行以上命令后,终端中的命令行提示符会出现类似于下图的状态:
首次进入这个隔离的环境,要做的第一件事是升级 PyPI 的版本,也就是 pip
命令:
pip install -U pip
这表示当前已经进入上图中红色方框框中显示的以此命名的“虚拟环境”,这里是“pyenv”。
3.3.3. 如何退出虚拟环境
执行以下的命令即可退出 VirtualEnv:
deactivate
成功执行上述命令后,看终端命令行提示符已经恢复原样。
3.4. 在 VirtualEnv 下安装
执行以下命令安装 Scrapy 命令行工具:
pip install -U scrapy
以上的内容把 Scrapy 虚拟环境配置指南按步骤地演绎出来,最后一步安装了 Scrapy 最新版。
4. Scrapy 爬虫的创建、编写和运行
本部分正式开始 Scrapy 爬虫的使用教程,这里以教您如何创建一个蜘蛛为例,简单地使用了一下 Scrapy,让您快速入门,之后好开展更深层次的学习。
4.1. 如何创建第一个 Scrapy 爬虫项目
本章节教会您如何用 Scrapy 爬取静态网站数据,也是响应本文的 Python 爬虫入门主题。
要抓取数据,首先要创建一个项目。
scrapy startproject tutorial
成功执行以上命令后,将在本目录中创建一个名为 tutorial
的目录,这是项目的根目录。
4.2. Scrapy 项目目录结构详解
项目根目录下有一个部署 Scrapy 爬虫的配置文件 scrapy.cfg
以及与项目同名的 Python 模块目录(其实就是编写蜘蛛代码所在的目录),于是默认的项目目录结构如下:
tutorial/
scrapy.cfg # 部署配置文件。对整个项目的部署
tutorial/ # 项目的 Python 模块,所有该爬虫的代码将在这个目录下生成和编写。
__init__.py
items.py # 项目条目定义文件。该文件定义要抓取的信息条目
middlewares.py # 项目中间件文件。定义 HTTP 请求的发出和收到响应过程中的处理操作
pipelines.py # 项目管道文件。管道文件处理条目(Items),它定义如何保存和处理条目
settings.py # 项目设置文件。负责定义爬虫基本信息、并发请求数目、注册中间件和管道等等任务
spiders/ # 稍后你将放置蜘蛛的程序代码文件所在目录。
__init__.py
实际上如下图:
4.3. 创建蜘蛛(Spider)的教程
要想运行 Scrapy 爬虫,必须创建蜘蛛代码文件,也就是在 tutorial/spiders
目录中创建一个能够抓取网上信息的代码文件。
本章节将带您创建您的 Scrapy 第一个爬虫代码示例。
4.3.1. 通过命令行工具创建
通过命令行工具自动地创建:
scrapy genspider [options] <name> <domain>
options
是可选的,可以过scrapy genspider --help
查看所有支持的参数选项。-
其中
name
是爬虫项目中每个蜘蛛的唯一识别名称,也就是说,项目中只能有一个这样的名称。 -
domain
为要抓取数据的网站或 API 的域名,可以是一个 HTTP URL。
执行以下命令创建一个名为 quotes
的蜘蛛:
# 当前所有目录为: /codes/code/python/scrapy
# 进入子目录 tutorial,这是项目的根目录,
# 以后如果没有特别的要求,默认执行 scrapy 命令的目录是此目录
cd tutorial/
# 代码目录在于当前目录的 tutorial/spiders 子目录
# 创建蜘蛛
scrapy genspider "quotes" "https://quotes.toscrape.com/page/1/"
4.3.2. 代码创建完成
于是,一个文件名为 quotes.py
的 Python 文件在 tutorial/spiders/
目录被 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
4.3.3. 示例代码
在入门教程文档中,有以下的代码:
from pathlib import Path
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
async def start(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}")
4.3.4. 蜘蛛代码关键知识点解析
name
:项目中的唯一蜘蛛识别名称,由scrapy genspider [options] <name> <domain>
的<name>
指定,然后启动爬虫时就是指定的<spider>
;start()
:爬虫开始的目标网址,数据的抓取从这些网址开始。该方法必须返回一个可迭代的值。该可迭代的值可以返回一个包含若干 HTTP 请求列表或者生成器;另,此方法必须是个异步生成器(用async
修饰的类方法/函数);parse()
:该方法用来解析 HTTP 响应,以及发起新的请求(如果需要的话);很多时候用来处理获取的数据,并且与Items
相关联(更多资料:https://docs.scrapy.org/en/2.13/topics/items.html)。这是个默认的方法,当 Request 对象没有指定回调方法时就采用该方法。
该方法的
response
参数包含爬虫的 HTTP 响应返回的相关数据,比如响应体,其中包含网页的 HTML 代码或者 API 数据。又或者是响应状态代码,如200、404等。
把上述代码复制粘贴到 tutorial/spiders/quotes.py
文件中。
4.3.5. 更简洁的代码,做同样的事情
上文提到,parse()
方法是 scrapy.Request
对象构造方法的默认回调方法。
然而,在 Scrapy 中,可以使用以下的代码做上文的代码相同的事情:
from pathlib import Path
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
"https://quotes.toscrape.com/page/1/",
"https://quotes.toscrape.com/page/2/",
]
def parse(self, response):
page = response.url.split("/")[-2]
filename = f"quotes-{page}.html"
Path(filename).write_bytes(response.body)
4.4. 开始爬取数据
在项目根目录(/codes/code/python/scrapy/tutorial/
)运行蜘蛛。
运行命令格式如下:
scrapy crawl [options] <spider>
其中:
options
:表示运行蜘蛛时的一些可选项,比如设置 Items 的保存输出文件等。具体的所有可选项通过命令
scrapy crawl --help
查看。-
spider
:表示本文前面所定义的name
,也就是项目中唯一的蜘蛛名称。
在项目根目录中执行以下命令来运行 Scrapy 爬虫 quotes
:
scrapy crawl quotes
爬虫成功运行的话,会输出类似于下图的情况:
执行爬虫运行命令后,在项目根目录会生成两个 .html
文件。依照代码可以看出,这两个文件正好是 start()
方法中的变量 urls
定义的两个 URL 的 HTTP 响应内容,文件装着的是通过蜘蛛获取的 HTML 代码。
5. 文档资源
本文使用的 Scrapy 版本是 2.13(截止到 2025-05,为最新版本)。
5.1. 官方网站和文档
- 官方网站首页:https://www.scrapy.org/
- 最新版本文档首页:https://docs.scrapy.org/en/latest/
- 2.13 版本的官方文档:https://docs.scrapy.org/en/2.13/
- 安装指南:https://docs.scrapy.org/en/2.13/intro/install.html
- 官方入门教程:https://docs.scrapy.org/en/2.13/intro/tutorial.html
本文的内容翻译整理自《官方入门教程》。
5.2. 中文网站与中文文档
开源社区中的贡献者创建了一个中文网站,这里有更新及时且最全的中文文档。
这个中文网站貌似只有最新 Scrapy 的中文文档,若无大版本的升级,这就够用了。
- 中文网站首页:https://scrapy.net.cn/
- Scrapy 爬虫官方文档中文版:https://docs.scrapy.net.cn/en/latest/index.html
- 中文安装指南:https://docs.scrapy.net.cn/en/latest/intro/install.html
- 中文入门教程:https://docs.scrapy.net.cn/en/latest/intro/tutorial.html
6. 总结
本文帮助 Python 初学者快速了解 Scrapy,是一个快速上手的中文初级入门教程。
通过本文,读者已掌握 Scrapy 入门的核心流程:从虚拟环境隔离依赖,到项目结构认知,再到蜘蛛代码编写与数据抓取。后续可结合官方文档深入学习数据解析、管道处理等进阶功能。网络爬虫需遵守网站 robots 协议,建议在合法合规场景下实践。
扩展:
通过官方或者中文文档迅速且全面地了解和学习这个 Python 爬虫工具。
文档里面,《Tutorial》让初学者快速了解爬虫的基本知识,而《基本概念》中的诸如 Items、管道、请求与响应、爬虫等等网页有更多的高级用法和深层次的东西值得一看。
继前续后
后面还有第二部分,主要讲解如何从网页中提取数据,并且介绍如何自动翻页。
第二部分链接: 新手必看的 Scrapy 爬虫数据提取与调试实战指南。
鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。
本文章可以转载,但是需要说明来源出处!
本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com