Lzh on GitHub

支持的 Python 版本

Scrapy 需要 Python 3.9+,无论是 CPython 实现(默认)还是 PyPy 实现(参见 备选实现)。

安装 Scrapy

如果你正在使用 AnacondaMiniconda,你可以从 conda-forge 频道安装包,该频道为 Linux、Windows 和 macOS 提供了最新的包。

要使用 conda 安装 Scrapy,运行:

conda install -c conda-forge scrapy

另外,如果你已经熟悉 Python 包的安装,你可以使用 pip 从 PyPI 安装 Scrapy 及其依赖:

pip install Scrapy

我们 强烈建议 你将 Scrapy 安装在 专用的虚拟环境 中,以避免与你的系统包冲突。

请注意,根据你的操作系统,这有时可能需要解决一些 Scrapy 依赖的编译问题,因此请务必查看 平台特定安装说明

有关更详细和平台特定的说明,以及故障排除信息,请继续阅读。

需要了解的事项

Scrapy 是用纯 Python 编写的,并依赖于一些关键的 Python 包(其中包括):

  • lxml,一个高效的 XML 和 HTML 解析器
  • parsel,一个基于 lxml 编写的 HTML/XML 数据提取库
  • w3lib,一个用于处理 URL 和网页编码的多用途辅助工具
  • twisted,一个异步网络框架
  • cryptographypyOpenSSL,用于处理各种网络级安全需求

其中一些包本身依赖于非 Python 包,这些包可能需要额外的安装步骤,具体取决于你的平台。请查看下面的 特定平台指南

如果遇到与这些依赖相关的任何问题,请参考它们各自的安装说明:

使用虚拟环境(推荐)

我们建议在所有平台上将 Scrapy 安装在虚拟环境中。

Python 包可以全局安装(又称系统级),也可以在用户空间安装。我们不建议在系统级安装 Scrapy。

相反,我们建议你将 Scrapy 安装在所谓的 “虚拟环境”(venv)中。虚拟环境允许你避免与已安装的 Python 系统包冲突(这可能会破坏你的某些系统工具和脚本),并且仍然可以使用 pip 正常安装包(无需 sudo 等)。

请参阅 虚拟环境和包 了解如何创建你的虚拟环境。

创建虚拟环境后,你可以在其中使用 pip 安装 Scrapy,就像安装任何其他 Python 包一样。(请参阅下面的 特定平台指南,了解你可能需要预先安装的非 Python 依赖)。

平台特定安装说明

Windows

尽管可以在 Windows 上使用 pip 安装 Scrapy,但我们建议你安装 AnacondaMiniconda,并使用 conda-forge 频道中的包,这将避免大多数安装问题。

安装 AnacondaMiniconda 后,使用以下命令安装 Scrapy:

conda install -c conda-forge scrapy

要在 Windows 上使用 pip 安装 Scrapy:

此安装方法需要 “Microsoft Visual C++” 来安装某些 Scrapy 依赖,这比 Anaconda 占用更多的磁盘空间。
  1. 下载并执行 Microsoft C++ Build Tools 来安装 Visual Studio Installer。
  2. 运行 Visual Studio Installer。
  3. 在“工作负载”部分,选择 C++ 构建工具
  4. 检查安装详细信息,并确保选择了以下包作为可选组件:
  • MSVC(例如 MSVC v142 - VS 2019 C++ x64/x86 构建工具 (v14.23))
  • Windows SDK(例如 Windows 10 SDK (10.0.18362.0))
  1. 安装 Visual Studio Build Tools。

现在,你应该能够使用 pip 安装 Scrapy

Ubuntu 14.04 或更高版本

Scrapy 目前使用足够新版本的 lxml、twisted 和 pyOpenSSL 进行测试,并与最新的 Ubuntu 发行版兼容。但它也应该支持较旧版本的 Ubuntu,如 Ubuntu 14.04,尽管可能存在 TLS 连接问题。

不要使用 Ubuntu 提供的 python-scrapy 包,它们通常太旧且无法及时跟上最新的 Scrapy 版本。

要在 Ubuntu(或基于 Ubuntu)系统上安装 Scrapy,你需要安装以下依赖:

sudo apt-get install python3 python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
  • python3-devzlib1g-devlibxml2-devlibxslt1-devlxml 所需的
  • libssl-devlibffi-devcryptography 所需的

之后,在 虚拟环境 中,你可以使用 pip 安装 Scrapy:

pip install scrapy
相同的非 Python 依赖可用于在 Debian Jessie (8.0) 及更高版本中安装 Scrapy。

macOS

构建 Scrapy 的依赖需要存在 C 编译器和开发头文件。在 macOS 上,这通常由 Apple 的 Xcode 开发工具提供。要安装 Xcode 命令行工具,打开终端窗口并运行:

xcode-select --install

存在一个 已知问题,会阻止 pip 更新系统包。必须解决此问题才能成功安装 Scrapy 及其依赖。以下是一些建议的解决方案:

  • (推荐)不要 使用系统 Python。安装一个不与系统其余部分冲突的新的、更新的版本。以下是使用 homebrew 包管理器的方法:
    • 按照 https://brew.sh/ 中的说明安装 homebrew
    • 更新你的 PATH 变量,声明 homebrew 包应在系统包之前使用(如果你使用 zsh 作为默认 shell,请相应地将 .bashrc 更改为 .zshrc):
      echo "export PATH=/usr/local/bin:/usr/local/sbin:$PATH" >> ~/.bashrc
      
    • 重新加载 .bashrc 以确保更改已生效:
      source ~/.bashrc
      
    • 安装 python:
      brew install python
      
  • (可选)在 Python 虚拟环境中安装 Scrapy。 此方法是上述 macOS 问题的变通方法,但它是管理依赖项的总体良好实践,并且可以补充第一种方法。

在任何这些变通方法之后,你应该能够安装 Scrapy:

pip install Scrapy

PyPy

我们建议使用最新的 PyPy 版本。对于 PyPy3,只测试了 Linux 安装。

大多数 Scrapy 依赖现在都有 CPython 的二进制 wheel 包,但没有 PyPy 的。这意味着这些依赖将在安装过程中构建。在 macOS 上,你可能会遇到构建 Cryptography 依赖的问题。此问题的解决方案在 此处 描述,即 brew install openssl,然后导出此命令推荐的标志(仅在安装 Scrapy 时需要)。在 Linux 上安装除了安装构建依赖外没有特殊问题。在 Windows 上使用 PyPy 安装 Scrapy 未经测试。

你可以通过运行 scrapy bench 来检查 Scrapy 是否正确安装。如果此命令给出诸如 TypeError: ... got 2 unexpected keyword arguments 的错误,这意味着 setuptools 无法获取一个 PyPy 特定的依赖。要解决此问题,请运行 pip install 'PyPyDispatcher>=2.1.0'

故障排除

AttributeError: ‘module’ object has no attribute ‘OP_NO_TLSv1_1’

安装或升级 Scrapy、Twisted 或 pyOpenSSL 后,你可能会收到一个带有以下回溯的异常:

[…]
  File "[…]/site-packages/twisted/protocols/tls.py", line 63, in <module>
    from twisted.internet._sslverify import _setAcceptableProtocols
  File "[…]/site-packages/twisted/internet/_sslverify.py", line 38, in <module>
    TLSVersion.TLSv1_1: SSL.OP_NO_TLSv1_1,
AttributeError: 'module' object has no attribute 'OP_NO_TLSv1_1'

你收到此异常的原因是你的系统或虚拟环境中的 pyOpenSSL 版本不受你的 Twisted 版本支持。

要安装你的 Twisted 版本支持的 pyOpenSSL 版本,请使用 tls 额外选项重新安装 Twisted:

pip install twisted[tls]

有关详细信息,请参阅 问题 #2473