Scrapy蜘蛛之间的分布式通信

问题描述 投票:0回答:2

我想以协调的方式运行两只蜘蛛。第一个蜘蛛会刮掉一些网站并生成URL,第二个将使用这些地址。我不能等到第一个蜘蛛完成然后启动第二个蜘蛛,因为网站变化非常快,第一个蜘蛛产生的URL需要立即抓取。一个非常简单的架构如下所示。目前,我正在为每个刮擦工作单独使用Scrapy。不知道怎么办呢?每个蜘蛛以不同的方式行事(具有不同的设置)并且做不同的工作。将它们放在不同的机器上(分布式)会很不错。

enter image description here

web-scraping scrapy scrapinghub
2个回答
0
投票

一个想法,也许是一个坏主意

运行第一个将废弃的URL保存到DB中的蜘蛛

像这样分开运行第二蜘蛛

def start_requests(self):
    while 1:
        select url from 1st_spider_urls
        yield Request(url)

        if first_spider_finished:
            break

它将继续从表中获取URL并立即抓取它们


0
投票

你的两只蜘蛛仍然可以独立。它们不需要协调,也不需要彼此通信。两者都只需要访问中央数据库。

Spider1仅负责使用URL填充数据库表。而Spider2只负责从中读取(如果你想跟踪,可能会更新行)。两只蜘蛛都可以独立启动/停止。如果Spider1停止,那么只要有URL,Spider2仍然可以继续运行。

在目前没有更多Spider2的URL的情况下,您可以通过配置引发spider_idle异常(DontCloseSpider)的documentation信号来保持活着。此时,您还可以从数据库中获取新批URL并对其进行爬网(example of crawling in signal)。

或者,您可以使用类似cron的东西来安排每隔几分钟执行一次Spider2。然后你不必担心让它保持活力。

© www.soinside.com 2019 - 2024. All rights reserved.