跳转到主要内容

Scrapyd客户端

项目描述

PyPI Version Build Status Coverage Status Python Version

Scrapyd-client是Scrapyd的客户端。它提供

命令行工具

  • scrapyd-deploy,将您的项目部署到Scrapyd服务器

  • scrapyd-client,用于部署后与项目交互

Python 客户端

  • ScrapydClient,用于在 Python 代码中与 Scrapyd 交互

scrapyd-deploy

将项目部署到 Scrapyd 服务器通常涉及两个步骤

  1. Eggifying 您的项目。您需要安装 setuptools 来完成此操作。请参阅下方的 Egg 注意事项

  2. 通过 addversion.json 端点将 egg 上传到 Scrapyd 服务器。

scrapyd-deploy 工具自动执行构建 egg 并将其推送到目标 Scrapyd 服务器的过程。

包含静态文件

如果 egg 需要包含静态(非 Python)文件,请编辑项目中的 setup.py 文件。否则,您可以跳过此步骤。

如果您没有 setup.py 文件,请使用以下命令创建一个:

scrapyd-deploy --build-egg=/dev/null

然后,在 setup.py 文件中设置 setup() 函数调用中的 package_data 关键字参数。示例(注意:projectname 将是您项目的名称)

from setuptools import setup, find_packages

setup(
    name         = 'project',
    version      = '1.0',
    packages     = find_packages(),
    entry_points = {'scrapy': ['settings = projectname.settings']},
    package_data = {'projectname': ['path/to/*.json']}
)

部署项目

首先将 cd 进入项目的根目录,然后可以使用以下命令部署项目

scrapyd-deploy <target> -p <project>

这将 eggify 您的项目并将其上传到目标。如果您的项目中有一个 setup.py 文件,它将被使用,否则将自动创建一个。

如果成功,您应该看到类似于以下所示的 JSON 响应

Deploying myproject-1287453519 to http://localhost:6800/addversion.json
Server response (200):
{"status": "ok", "spiders": ["spider1", "spider2"]}

为了避免必须指定目标和项目,您可以在 Scrapy 配置文件 中设置默认值。

版本控制

默认情况下,scrapyd-deploy 使用当前时间戳生成项目版本,如上所示。但是,您可以使用 --version 传递自定义版本。

scrapyd-deploy <target> -p <project> --version <version>

版本必须与 LooseVersion 可比较。除非指定,否则 Scrapyd 将使用最高版本。

如果您使用 Mercurial 或 Git,可以使用 HGGIT 分别作为 --version 的参数,以使用当前修订版作为版本。您可以通过将其添加到 scrapy.cfg 中目标的条目来避免指定版本参数。

[deploy]
...
version = HG

本地设置

您可能希望保留某些设置为本地,而不是将它们部署到 Scrapyd。为了完成此操作,您可以在项目根目录中创建一个 local_settings.py 文件(其中包含 scrapy.cfg 文件),并在项目的设置中添加以下内容

try:
    from local_settings import *
except ImportError:
    pass

scrapyd-deploy 不会部署项目模块之外的内容,因此 local_settings.py 文件不会被部署。

Egg 注意事项

在为 Scrapy 项目构建 eggs 时需要注意的一些事项

  • 确保在构建 egg 时不包含任何本地开发设置。find_packages 函数可能会抓取您的自定义设置。在大多数情况下,您希望上传带有默认项目设置的 egg。

  • 避免在项目代码中使用 __file__,因为它与 eggs 不兼容。考虑使用 pkgutil.get_data 代替。而不是

    path = os.path.dirname(os.path.realpath(__file__))  # BAD
    open(os.path.join(path, "tools", "json", "test.json"), "rb").read()

    使用

    import pkgutil
    pkgutil.get_data("projectname", "tools/json/test.json")
  • 在项目中写入磁盘时请小心,因为Scrapyd很可能会以不同的用户身份运行,可能没有对某些目录的写入权限。如果可能,请避免写入磁盘,并始终使用 tempfile 来处理临时文件。

包含依赖项

如果您的项目有额外的依赖项,您可以在Scrapyd服务器上安装它们,或者可以通过以下两个步骤将它们包含在项目的egg文件中:

  • 在项目的根目录下创建一个 requirements.txt 文件

  • 在构建或部署项目时使用 --include-dependencies 选项

    scrapyd-deploy --include-dependencies

scrapyd-client

要查看每个子命令的参考,请调用 scrapyd-client <subcommand> --help

在可能使用通配符进行过滤的地方,可以使用 fnmatch 来实现。如果 scrapy.cfg 中存在一个 --project 选项,则可以省略。

deploy

这是对 scrapyd-deploy 的封装。

projects

列出Scrapyd实例的所有项目

# lists all projects on the default target
scrapyd-client projects
# lists all projects from a custom URL
scrapyd-client -t http://scrapyd.example.net projects

schedule

安排一个或多个蜘蛛执行

# schedules any spider
scrapyd-client schedule
# schedules all spiders from the 'knowledge' project
scrapyd-client schedule -p knowledge \*
# schedules any spider from any project whose name ends with '_daily'
scrapyd-client schedule -p \* \*_daily

spiders

列出一个或多个项目的蜘蛛

# lists all spiders
scrapyd-client spiders
# lists all spiders from the 'knowledge' project
scrapyd-client spiders -p knowledge

ScrapydClient

在Python代码中与Scrapyd进行交互。

from scrapyd_client import ScrapydClient
client = ScrapydClient()

for project in client.projects():
   print(client.jobs(project=project))

Scrapy配置文件

目标

您可以在项目的 scrapy.cfg 文件中定义Scrapyd目标。示例

[deploy]
url = http://scrapyd.example.com/api/scrapyd
username = scrapy
password = secret
project = projectname

现在,您可以在不使用 <target> 参数或 -p <project> 选项的情况下部署项目

scrapyd-deploy

如果您有多个目标,请将目标名称添加到节名称中。示例

[deploy:targetname]
url = http://scrapyd.example.com/api/scrapyd

[deploy:another]
url = http://other.example.com/api/scrapyd

如果您正在使用CD框架,则不需要将您的机密信息提交到您的存储库。您可以使用环境变量扩展,如下所示

[deploy]
url = $SCRAPYD_URL
username = $SCRAPYD_USERNAME
password = $SCRAPYD_PASSWORD

或者使用此语法

[deploy]
url = ${SCRAPYD_URL}
username = ${SCRAPYD_USERNAME}
password = ${SCRAPYD_PASSWORD}

要部署到一个目标,运行

scrapyd-deploy targetname -p <project>

要部署到所有目标,使用 -a 选项

scrapyd-deploy -a -p <project>

要列出所有可用的目标,使用 -l 选项

scrapyd-deploy -l

要列出一个目标上所有可用的项目,使用 -L 选项

scrapyd-deploy -L example

虽然您的目标需要在 scrapy.cfg 中使用其URL进行定义,但您可以使用 netrc 来处理用户名和密码,如下所示

machine scrapyd.example.com
    username scrapy
    password secret

历史记录

1.2.3 (2023-01-30)

  • feat: 添加 scrapyd-client --username--password 选项。(@mxdev88)

  • feat: 扩展 scrapy.cfg 文件中的环境变量。(@mxdev88)

  • feat: 添加 ScrapydClient:一个用于与Scrapyd交互的Python客户端。(@mxdev88)

  • 添加对Python 3.10和3.11的支持。(@Laerte)

1.2.2 (2022-05-03)

  • fix: 修复使用 scrapyd-deploy --deploy-all-targets 时出现的 FileNotFoundError

1.2.1 (2022-05-02)

  • feat: 添加 scrapyd-deploy --include-dependencies 选项,从 requirements.txt 文件中安装项目依赖项。(@mxdev88)

  • fix: 删除由 scrapyd-deploy --deploy-all-targets 创建的临时目录。

  • chore: 解决弃用警告。

  • chore: 添加对 urllib3 的依赖。

1.2.0 (2021-10-01)

  • 添加对Scrapy 2.5的支持。

  • 添加对Python 3.7、3.8、3.9、PyPy3.7的支持。

  • 放弃对Python 2.7、3.4、3.5的支持。

  • 移除 scrapyd_client.utils.get_config,它是一个针对Python 2.7的兼容性包装器。

1.2.0a1 (2017-08-24)

  • scrapyd-deploy 安装为控制台脚本。

  • 新增了带有 deployprojectsspidersschedule 子命令的 scrapyd-client CLI。

1.1.0 (2017-02-10)

  • 新增 -a 选项以部署到所有目标。

  • 修复了 egg 部署错误中的 returncode。

  • 添加了 Python 3 支持。

  • 放弃了 Python 2.6 支持。

1.0.1 (2015-04-09)

初始版本。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

scrapyd-client-1.2.3.tar.gz (20.9 kB 查看哈希值)

上传时间 源代码

构建分发

scrapyd_client-1.2.3-py3-none-any.whl (15.3 kB 查看哈希值)

上传时间 Python 3

支持