从Scrapy管道中提升近距离蜘蛛

时间:2018-05-20 04:22:45

标签: python scrapy

我需要从Scrapy Pipeline中提升CloseSpider。或者将一些参数从Pipeline返回到Spider来进行加注。

例如,如果日期已经存在,请提高CloseSpider:

raise CloseSpider('Already been scraped:' + response.url)

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:3)

与草率文档一样,只能从Spider中的回调函数(默认情况下为解析函数)引发CloseSpider Exception。在管道中提升蜘蛛会使其崩溃。为了从管道中获得类似的结果,可以启动关闭信号,该信号将正常关闭刮板。

from scrapy.project import crawler  
crawler._signal_shutdown(9,0)

请记住,即使在发出关闭信号后,scrapy仍可能处理已触发的请求甚至调度的请求。

要在Spider中执行此操作,请在Pipeline的Spider中设置一些变量,如下所示。

def process_item(self, item, spider):
    if some_condition_is_met:
        spider.close_manually = True

之后,在您的Spider的回调函数中,您可以引发Close Spider异常。

def parse(self, response):
    if self.close_manually:
        raise CloseSpider('Already been scraped.')

答案 1 :(得分:0)

我更喜欢以下解决方案。

class MongoDBPipeline(object):

def process_item(self, item, spider):
    spider.crawler.engine.close_spider(self, reason='duplicate')

来源:Force spider to stop in scrapy