我需要从Scrapy Pipeline中提升CloseSpider。或者将一些参数从Pipeline返回到Spider来进行加注。
例如,如果日期已经存在,请提高CloseSpider:
raise CloseSpider('Already been scraped:' + response.url)
有办法做到这一点吗?
答案 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')