本章节用一个 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