我需要从Scrapy Pipeline筹集CloseSpider。要么将某些参数从Pipeline返回到Spider进行加注。
例如,如果日期已经存在,请引发CloseSpider:
raise CloseSpider('Already been scraped:' + response.url)
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
从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)
我更喜欢以下解决方案。
class MongoDBPipeline(object):
def process_item(self, item, spider):
spider.crawler.engine.close_spider(self, reason='duplicate')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |