从Scrapy管道中举起蜘蛛

Mor*_*tch 5 python scrapy

我需要从Scrapy Pipeline筹集CloseSpider。要么将某些参数从Pipeline返回到Spider进行加注。

例如,如果日期已经存在,请引发CloseSpider:

raise CloseSpider('Already been scraped:' + response.url)
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Ahs*_*Roy 5

从scrapy docs 开始,CloseSpider 异常只能从Spider 中的回调函数(默认为解析函数)引发。在管道中提高它会使蜘蛛崩溃。为了从管道中获得类似的结果,您可以启动一个关闭信号,这将优雅地关闭scrapy。

from scrapy.project import crawler  
crawler._signal_shutdown(9,0)
Run Code Online (Sandbox Code Playgroud)

请记住,即使在启动关闭信号之后,scrapy 也可能会处理已经触发甚至预定的请求。

要从 Spider 执行此操作,请像这样在来自 Pipeline 的 Spider 中设置一些变量。

def process_item(self, item, spider):
    if some_condition_is_met:
        spider.close_manually = True
Run Code Online (Sandbox Code Playgroud)

在您的蜘蛛的回调函数中,您可以在此之后引发关闭蜘蛛异常。

def parse(self, response):
    if self.close_manually:
        raise CloseSpider('Already been scraped.')
Run Code Online (Sandbox Code Playgroud)


Mac*_*ric 1

我更喜欢以下解决方案。

class MongoDBPipeline(object):

def process_item(self, item, spider):
    spider.crawler.engine.close_spider(self, reason='duplicate')
Run Code Online (Sandbox Code Playgroud)

来源:强制蜘蛛在 scrapy 中停止