集蜂云是一个可以让开发者在上面构建、部署、运行、发布采集器的数据采集云平台。加入到数百名开发者中,将你的采集器发布到市场,从而给你带来被动收入吧!
考虑过在服务器上托管您的Scrapy项目吗?Scrapyd使这一切变得无缝,让您能够轻松安排、监控和部署爬虫。 在这篇教程中,您将学习如何使用Scrapyd来远程管理Scrapy爬虫。
Scrapyd是一个在服务器上部署Scrapy Spider的工具,它允许您通过简单的API调用来远程管理它们。 Scrapyd服务器作为一个守护服务,会监听来自spider的crawl请求并自动执行它们。 作为管理服务器工具,Scrapyd为您的Scrapy项目提供以下额外好处:
接下来,让我们看看如何使用Scrapyd来部署Scrapy Spider。
通过 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
]
抓取工具已运行,一切就绪!现在,让我们部署它。
在部署爬虫之前,您需要启动 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 <target_name> -p <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 的 JSON API 端点是管理Spider的首选方式。尽管也有 Web 界面用于任务监控和日志查看,但其功能有限。现在让我们来看看如何管理Spider,包括设置 cron 作业。
Scrapyd 提供了不同的端点用于任务调度、监控和取消。下面详细介绍每个端点的功能。 任务调度端点位于 http://localhost:6800/schedule.json。 以下是使用 JSON API 调度任务的基本 CURL 语法:
curl http://localhost:6800/schedule.json -d project=<YOUR_PROJECT_NAME> -d spider=<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=<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 是一个集群管理器,用于通过用户界面运行 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 是基于 Django 和 Scrapy 的集群管理工具,提供了 cron 作业、间隔和基于日期的调度、日志记录以及可视化代码编辑器等功能。接下来,您可以配置 Gerapy 与 Scrapyd 的同步,上传您的 Scrapy 项目,并使用其集成的代码编辑器。 首先,使用以下命令安装该包pip:
pip install gerapy
使用以下步骤初始化 Gerapy:
成功完成上述步骤后,您应该会收到一条确认消息。
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更近了一步。
您可以在终端上查看 Scrapyd 和 Gerapy 服务器的运行状态。您现在应该可以看到按照您选择的间隔运行的请求。 为了更好地可视化任务的统计数据,请按照以下步骤操作:
例如,下面的可视化示例显示所有 710 个任务的成功率均为 100%。 Gerapy 提供了上传 Scrapy 项目并使用内置代码编辑器即时编辑的功能。 这涉及通过用户界面直接将您的项目上传到 Gerapy 或手动将其移动到 Gerapy 的项目文件夹中。 以下是通过用户界面上传项目的步骤示例:
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 项目,并掌握了以下内容:
集蜂云是一个可以让开发者在上面构建、部署、运行、发布采集器的数据采集云平台。平台提供了海量任务调度、三方应用集成、数据存储、监控告警、运行日志查看等功能,能够提供稳定的数据采集环境。平台提供丰富的采集模板,简单配置就可以直接运行,快来试一下吧。