创造Scrapy永远不会结束蜘蛛

时间:2016-06-09 06:42:18

标签: python scrapy pika

我创建了一个scrapy库scrapy-mq-redis,并希望蜘蛛永无止境。我使用了spider_idle信号处理程序来阻止它关闭(从上游库中选择它)。

有没有办法在这个函数中访问调度程序,这样我就可以调用next_request函数并处理更多的传入请求,甚至可能更多的start_urls?

如果需要进一步说明,请告诉我。

编辑:可能重复的问题有自定义的create_request方法。 对于我的库,我需要通过收到它的完全相同的通道向RabbitMQ发送消息的确认。这就是为什么调度程序/队列中有一个监听器用于处理请求(response_received)。所以,我特别需要使用调度程序来创建请求。

另一种方法是在我的蜘蛛中为response_received设置另一个监听器,这意味着所有请求/响应的广播将被发送到两个方法,然后我必须确定是否从特定进程接收了消息然后因此发送确认。这在两个不同的模块中增加了相同过程的额外处理和复制。

我希望这能澄清我的要求。

1 个答案:

答案 0 :(得分:1)

我发现调度程序在蜘蛛中可用,如下所示:

self.crawler.engine.slot.scheduler.next_request()

我在蜘蛛中添加了听众,如下所示:

self.crawler.signals.connect(self.spider_idle, signal=signals.spider_idle)

回调如下:

def spider_idle(self):
    self.crawler.engine.slot.scheduler.next_request()
    raise DontCloseSpider

这可以使蜘蛛保持活跃状态​​,并查找可能已添加到队列中的新请求。