35

如果条件为真(如 scrap_item_id == predefine_value ),是否有机会停止抓取。我的问题类似于Scrapy - 如何识别已经刮掉的网址,但我想在发现最后一个刮掉的项目后“强制”我的刮板蜘蛛停止爬行。

4

4 回答 4

40

在 GitHub 上提供的最新版本的 Scrapy 中,您可以引发 CloseSpider 异常来手动关闭蜘蛛。

0.14 发行说明文档中提到:“添加 CloseSpider 异常以手动关闭蜘蛛 (r2691)”

根据文档的示例:

def parse_page(self, response):
  if 'Bandwidth exceeded' in response.body:
    raise CloseSpider('bandwidth_exceeded')

另请参阅:http ://readthedocs.org/docs/scrapy/en/latest/topics/exceptions.html?highlight=closeSpider

于 2011-11-01T16:03:36.597 回答
11

这个问题是 8 个月前提出的,但我想知道同样的事情,并找到了另一个(不是很好)的解决方案。希望这可以帮助未来的读者。

我正在连接到管道文件中的数据库,如果数据库连接不成功,我希望蜘蛛停止爬行(如果无处可发送数据,则收集数据毫无意义)。我最终做的是使用:

from scrapy.project import crawler
crawler._signal_shutdown(9,0) #Run this if the cnxn fails.

这会导致蜘蛛执行以下操作:

[scrapy] INFO: Received SIGKILL, shutting down gracefully. Send again to force unclean shutdown.

在阅读了您的评论并查看了“/usr/local/lib/python2.7/dist-packages/Scrapy-0.12.0.2543-py2.7.egg/scrapy/crawler.py”文件后,我只是将其拼凑起来. 我不完全确定它在做什么,传递给函数的第一个数字是签名(例如,使用 3,0 而不是 9,0 返回错误[scrapy] INFO: Received SIGKILL...

不过似乎工作得很好。快乐刮。

编辑:我还认为您可以通过以下方式强制您的程序关闭:

import sys
sys.exit("SHUT DOWN EVERYTHING!")
于 2011-08-16T03:23:15.293 回答
3

从管道中,我更喜欢以下解决方案。

class MongoDBPipeline(object):

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

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

于 2019-11-07T23:34:40.923 回答
0

尝试了很多选项,没有任何效果。这个肮脏的 hack 为 Linux 做的伎俩:

os.kill(os.getpid(), signal.SIGINT)
os.kill(os.getpid(), signal.SIGINT)

这会向scrapy 发送两次SIGINT 信号。第二个信号强制关机

于 2020-08-10T18:37:04.233 回答