logo

如何使用Scrapyd

2024-06-24 14:19
本文介绍了Scrapyd概念与使用教程

集蜂云是一个可以让开发者在上面构建、部署、运行、发布采集器的数据采集云平台。加入到数百名开发者中,将你的采集器发布到市场,从而给你带来被动收入吧!

考虑过在服务器上托管您的Scrapy项目吗?Scrapyd使这一切变得无缝,让您能够轻松安排、监控和部署爬虫。 在这篇教程中,您将学习如何使用Scrapyd来远程管理Scrapy爬虫。

什么是 Scrapyd?

Scrapyd是一个在服务器上部署Scrapy Spider的工具,它允许您通过简单的API调用来远程管理它们。 Scrapyd服务器作为一个守护服务,会监听来自spider的crawl请求并自动执行它们。 作为管理服务器工具,Scrapyd为您的Scrapy项目提供以下额外好处:

  1. 快速远程部署和管理Python Scrapy项目。
  2. 使用统一的JSON API平台有效地管理所有抓取作业。
  3. 通过用户友好的网络界面跟踪和监控抓取过程。
  4. 可以在多个服务器上执行spider,从而扩展和增强数据收集能力。
  5. 通过调整并发spider数量来优化服务器性能。
  6. 可以与诸如Celery和Gerapy等工具集成,实现任务调度的自动化和简化。
  7. 可以与Python框架(如Django)集成,扩展Web应用程序的功能。

接下来,让我们看看如何使用Scrapyd来部署Scrapy Spider。

如何运行 Scrapyd Spiders 进行网页抓取

通过 Scrapyd 运行爬虫涉及几个步骤,让我们看看它是如何工作的。

先决条件

您需要 Python版本3或更高版本才能运行 Scrapy 和 Scrapyd。 首先,您需要使用以下命令安装Scrapy、Scrapyd和Scrapy-Client:

pip install scrapyd scrapy scrapyd-client

接下来,使用命令行运行 scrapy startproject <YOUR_PROJECT_NAME> 创建一个Scrapy项目。

然后,打开Scrapy项目中的 spiders 文件夹,并在其中创建一个 scraper.py 文件。

我们将编写一个简单的Scrapy Spider,从ScrapingCourse.com的产品页面中提取产品信息。 将以下代码粘贴到您的spiders/scraper.py中。

# import the required modules
from scrapy.spiders import Spider
 
class MySpider(Spider):
    # specify the spider name
    name = 'product_scraper'
    start_urls = ['https://www.scrapingcourse.com/ecommerce/']
 
    # parse HTML page as response
    def parse(self, response):
        # extract text content from the ul element
        products = response.css('ul.products li.product')
        
        data = []
 
        for product in products:
            # parent = product.css('li.product')
            product_name = product.css('h2.woocommerce-loop-product__title::text').get()
            price = product.css('bdi::text').get()
 
            # append the scraped data into the empty data array
            data.append(
                {
                'product_name': product_name,
                'price': price,
            }
            )
 
        # log extracted text
        self.log(data)

为了确认一切运行正常,您可以通过运行 scrapy crawl product_scraper 来测试代码。 以下是抓取项目时生成的日志:

[
    {'product_name': 'Abominable Hoodie', 'price': '69.00'}, 
    {'product_name': 'Adrienne Trek Jacket', 'price': '57.00'}, 
    {'product_name': 'Aeon Capri', 'price': '48.00'}, 
    
    #... other products omitted for brevity
]

抓取工具已运行,一切就绪!现在,让我们部署它。

将 Spider 部署到 Scrapyd

在部署爬虫之前,您需要启动 Scrapyd 服务器。为此,请打开命令行并转到项目根文件夹并运行:

scrapyd

如果您在控制台中看到服务器的端口号(如下所示),这表明您已成功启动Scrapyd服务器。太棒了!您离完成就差一步了。

 Site starting on 6800

接下来,打开位于Scrapy项目根文件夹中的 scrapy.cfg 文件,并取消注释 url 变量。然后,将 deploy 选项设置为 local,以便在本地机器上进行部署。 确保 default 设置将 Scrapyd 指向您的 Scrapy 设置文件,而 project 应设置为您的项目名称。 您的 scrapy.cfg 文件应该类似于这样:

[settings]
default = scraper.settings
 
[deploy:local]
url = http://localhost:6800/
project = scraper

接下来是部署您的spider。这将允许 Scrapyd API 跟踪spider的状态,并将其同步到 Web 界面以进行监控。 以下是spider部署的基本命令示例。target_name 是部署目标(在本例中为 local),our_project_name 是您的项目名称(在我们的例子中是 scraper)。

scrapyd-deploy &#x3C;target_name> -p &#x3C;your_project_name>

让我们通过另一个终端将其应用到你的 Scrapy 项目,如下所示:

scrapyd-deploy local -p scraper

这应该返回一个 JSON 响应,其中包括您的节点名称和响应状态:

{"node_name": "User", "status": "ok", "project": "scraper", "version": "1701728434", "spiders": 1}

要进行进一步验证,您可以通过浏览器访问 Scrapyd 的内置 Web 界面,地址是 http://localhost:6800。 在“可用项目”中,您将看到列出了您的项目(例如,“scraper”)。

使用 Scrapyd 管理Spider

Scrapyd 的 JSON API 端点是管理Spider的首选方式。尽管也有 Web 界面用于任务监控和日志查看,但其功能有限。现在让我们来看看如何管理Spider,包括设置 cron 作业。

爬取和监控的端点

Scrapyd 提供了不同的端点用于任务调度、监控和取消。下面详细介绍每个端点的功能。 任务调度端点位于 http://localhost:6800/schedule.json。 以下是使用 JSON API 调度任务的基本 CURL 语法:

curl http://localhost:6800/schedule.json -d project=&#x3C;YOUR_PROJECT_NAME> -d spider=&#x3C;YOUR_SPIDER_NAME>

要持续应用并运行此请求,请在项目的根文件夹中创建一个名为 schedule.py 的新 Python 文件,并使用 Python 的 POST 请求来修改 CURL 命令,如下所示: 其中,scraper 是项目名称,product_scraper 是Spider名称。

# import the required library
import requests
 
# speficy schedule endpoint
url = 'http://localhost:6800/schedule.json'
 
# specify project and spider names
data = {'project': 'scraper', 'spider': 'product_scraper'}
 
# make Python request
response = requests.post(url, data=data)
 
# resolve and print the JSON response
if response.status_code == 200:
    print(response.json())
else:
    print(response.json())

运行上述 Python 脚本将输出 JSON 响应,显示节点名称、状态和作业 ID:

{'node_name': 'User', 'status': 'ok', 'jobid': '3971374a92fc11eeb09b00dbdfd2847f'}

恭喜!您已成功使用 Scrapyd 安排了第一个 Scrapy 任务。

现在,让我们来监控这个任务的执行情况。

监控端点为 http://localhost:6800/listjobs.json。 该端点列出了所有可用任务的详细信息。您可以通过添加 project 参数来查看特定项目的任务。

以下是使用 CURL 查看项目下所有任务的格式:

curl http://localhost:6800/listjobs.json?project=&#x3C;YOUR_PROJECT_NAME>

为了定期监控您的 Scrapy Spider任务,请在 Scrapy 项目的根目录中创建一个新的 monitor.py 文件,并使用以下 GET 请求获取 Scrapyd 上任务的信息:

# import the required library
import requests
 
# speficy schedule endpoint
url = 'http://localhost:6800/listjobs.json'
 
# specify request parameters
params = {'project': 'scraper'}
 
# make Python request
response = requests.get(url, params=params)
 
# resolve and print the JSON response
if response.status_code == 200:
    print(response.json())
else:
    print(response.json())

要获取 monitor.py 脚本中列出的信息,包括节点名称、请求状态、计划信息(包括pending、running和finished任务)、任务ID、开始时间、结束时间、日志和项目目录,您可以结合使用 Scrapyd 的 JSON API 和 Python 的请求库。以下是一个示例脚本,用于获取和处理这些信息: pending和数组running为空,因为没有待处理或正在运行的任务。

{'node_name': 'User', 'status': 'ok', 'pending': [], 'running': [], 'finished': [{'project': 'scraper', 'spider': 'product_scraper', 'id': '3971374a92fc11eeb09b00dbdfd2847f', 'start_time': '2023-12-05 00:24:08.854899', 'end_time': '2023-12-05 00:24:15.445038', 'log_url': '/logs/scraper/product_scraper/3971374a92fc11eeb09b00dbdfd2847f.log', 'items_url': '/items/scraper/product_scraper/3971374a92fc11eeb09b00dbdfd2847f.jl'}]}

ScrapydWeb:Spider监控的图形界面

ScrapydWeb 是一个集群管理器,用于通过用户界面运行 Scrapyd 的 JSON API。它也是基于守护进程的,可以监听 Scrapyd 集群内的变化,让您可以部署爬虫、安排抓取作业、监控爬虫任务以及查看日志。

ScrapydWeb 的唯一缺点是,在撰写本文时,它仅限于低于 3.9 的 Python 版本。因此,您可能需要降级到 Python 2.7 才能使用它。

除了版本兼容性限制之外,Scrapyd 是从用户界面管理Spider的最佳工具。

一个有用的技巧是安装并隔离 scrapydweb到专用的 Python 2.7 虚拟环境中。然后,使用较新的 Python 版本环境来处理其他依赖项,如 Scrapy 和 Scrapyd。

首先,使用以下命令安装该包pip:

pip install scrapydweb

安装完成后,打开命令行,进入您的 Scrapy 项目根目录,并执行 scrapydweb 命令。这将在您的项目文件夹中创建一个新文件 scrapydweb_settings_v10.py。 在 scrapydweb_settings_v10.py 文件的 SCRAPYD_SERVERS 部分,将本地 Scrapyd 服务器端口设置为 6800。这意味着 ScrapydWeb 将自动连接到并管理运行在该端口上的任何 Scrapyd 集群。 再次运行 scrapydweb 命令以启动 ScrapydWeb 服务器。这将启动 ScrapydWeb 守护进程并显示服务器的 URL,如下所示:

http://127.0.0.1:5000

在浏览器中访问该 URL。您应该会看到 ScrapydWeb 用户界面,如下所示。 要在运行集群内调度spider,请勾选127.0.0.1.6800并单击“run spider”选项卡。然后单击“ multinode run spider”。 接下来,从提供的字段中选择您的集群服务器、项目和spider名称。 您可以点击“设置和参数”来指定用户代理或为任务启用 cookie。“计时器任务”切换还允许您安排 cron 作业。 最后,点击“检查CMD”,点击“运行Spider”。 为了确认系统有效性,请转到侧边栏上的“Jobs”(作业)选项。在这里,您应该能够看到之前安排的所有任务的列表。滚动页面到右侧,记录每个任务的状态和其他相关信息。 到此部署就成功了!请随意试用 ScrapydWeb 的功能,了解其spider管理能力。

Gerapy:漂亮的代码编辑器和其他实用程序

Gerapy 是基于 Django 和 Scrapy 的集群管理工具,提供了 cron 作业、间隔和基于日期的调度、日志记录以及可视化代码编辑器等功能。接下来,您可以配置 Gerapy 与 Scrapyd 的同步,上传您的 Scrapy 项目,并使用其集成的代码编辑器。 首先,使用以下命令安装该包pip:

pip install gerapy

使用以下步骤初始化 Gerapy:

  1. 在当前工作文件夹中运行 gerapy init 命令。这将创建 Gerapy 的工作区。
  2. 因为 Gerapy 基于 Django,所以运行 gerapy migrate 来更新 Gerapy 的数据库模式。
  3. 使用 gerapy createsuperuser 命令创建一个超级用户账号。按照提示输入您的身份验证凭据完成注册。

成功完成上述步骤后,您应该会收到一条确认消息。

Superuser created successfully.

接下来,在终端中运行以下命令来启动 Gerapy 服务器:

gerapy runserver

这将在 启动一个开发服务器 http://127.0.0.1:8000/。 在浏览器中启动该 URL 以加载 Gerapy 用户界面。 请输入您之前设置的用户名和密码。 恭喜!您已成功启动 Gerapy 的用户界面。 接下来,将 Gerapy 配置到本地 Scrapyd 服务器将非常有用,以便对您的spider进行调度和监控。 转到 Gerapy 的“客户端”页面,并点击右上角的“创建”。 在“名称”字段中输入“local”,在“IP”字段中输入您本地服务器的IP地址,在“端口”字段中输入您的 Scrapyd 端口号。完成后,点击“创建”按钮,即可将 Gerapy 与您的 Scrapyd 服务器进行同步。 现在,您离使用 Gerapy 调度spider更近了一步。

  1. 点击侧边栏的“任务”,然后点击“创建”按钮。
  2. 输入任务名称。
  3. 在“项目”字段中填写您的 Scrapy 项目名称,在“Spider”字段中填写您的 Spider 名称。
  4. 从“客户端”下拉菜单中选择“本地”。
  5. 在“触发器”下拉菜单中,选择间隔、日期或 Crontab(用于 cron 作业),并配置适当的时间触发器。例如,如果选择间隔触发器,可以设置每隔几秒运行一次任务。
  6. 完成配置后,点击“创建”按钮。

您可以在终端上查看 Scrapyd 和 Gerapy 服务器的运行状态。您现在应该可以看到按照您选择的间隔运行的请求。 为了更好地可视化任务的统计数据,请按照以下步骤操作:

  1. 点击 Gerapy 页面上的“任务”选项卡。
  2. 转到“状态”页面,您将实时加载任务的统计数据。

例如,下面的可视化示例显示所有 710 个任务的成功率均为 100%。 Gerapy 提供了上传 Scrapy 项目并使用内置代码编辑器即时编辑的功能。 这涉及通过用户界面直接将您的项目上传到 Gerapy 或手动将其移动到 Gerapy 的项目文件夹中。 以下是通过用户界面上传项目的步骤示例:

  1. 确保您的 Scrapy 项目文件夹已经压缩。
  2. 进入 Gerapy 页面的“项目”选项卡。
  3. 点击页面右上角的“创建”按钮。 选择“上传”,然后上传项目的压缩包。完成上传后,点击“完成”。 您现在应该可以在“项目”页面上看到已上传的项目。单击“部署”开始启动。 接下来,在“BUILD PROJECT”部分输入描述,然后点击“Build”。成功消息将确认您的构建已成功完成。 要使用代码编辑器,请转到 Gerapy 的“项目”页面。在这里,您将看到之前成功构建的项目列表。 点击您希望编辑的项目,然后点击“编辑”,即可打开 Gerapy 的实时代码编辑器。在这个编辑器中,您可以开始编辑您的项目代码。 代码编辑器如下所示:

最大程度提高 Spider 任务管理效率

Scrapyd 通过并发、优先队列管理和动态资源分配等功能进一步实现了spider调度的优化。

其中一个显著特点是其允许根据机器性能控制并发级别。例如,max_proc 是一种内置方法,用于定义同时执行的最大spider数量。

由于 Scrapyd 的集中式架构,您可以将spider分布到多台机器上,并精确控制每台机器内的执行情况。在这种情况下,maxprocper_cpu 是另一个内置功能,允许您管理每台机器的并发任务数。

此外,Scrapyd 提供任务优先级的支持,您可以利用这一功能控制不同spider版本在异步作业队列中的并发执行顺序。

虽然 Scrapyd 并不直接支持基于时间的调度,但您可以通过设置时间或事件驱动的条件来触发 schedule.json 端点。

总之,这些功能使得 Scrapyd 能够高效地管理复杂的抓取工作计划和系统资源。

与其他工具集成

Scrapyd 的能力在于与多种工具的集成,增强了您使用 Scrapy Spider时的可扩展性。

Scrapyd有效地支持任务管理工具,如 ScrapydWeb 和 Gerapy。例如,ScrapydWeb 支持通过 Slack、Telegram 和电子邮件发送监控通知。

为了保证spider数据的一致性存储,Scrapyd 支持多种数据库解决方案,包括 MongoDB、MySQL 和 PostgreSQL。

虽然 Scrapyd 主要用于本地托管,但它也完全支持在 Azure、Google Cloud 和 AWS 等云服务上进行数据存储和spider部署。

结论

在本 Scrapyd 教程中,您学习了如何使用 Scrapyd 托管您的 Scrapy 项目,并掌握了以下内容:

  1. 如何利用 Scrapyd 的 JSON 端点来调度spider。
  2. Scrapyd 的工作原理及其基本操作。
  3. 使用 Scrapyd 部署spider的步骤和技巧。
  4. Scrapyd 与第三方spider管理工具的集成方法。
  5. 如何通过 Scrapyd 的 JSON API 来管理和监控您的spider。
  6. 如何有效地将 Scrapyd 与 Scrapy 框架无缝集成。

集蜂云是一个可以让开发者在上面构建、部署、运行、发布采集器的数据采集云平台。平台提供了海量任务调度、三方应用集成、数据存储、监控告警、运行日志查看等功能,能够提供稳定的数据采集环境。平台提供丰富的采集模板,简单配置就可以直接运行,快来试一下吧。

导航目录