强迫我的scrapy蜘蛛停止爬行

时间:2010-12-15 10:05:21

标签: python scrapy

如果条件为真,则有可能在特定情况下停止抓取(例如scrap_item_id == predefine_value)。我的问题类似于Scrapy - how to identify already scraped urls,但我想在发现最后一个被刮掉的物品后“强迫”我的scrapy蜘蛛停止爬行。

4 个答案:

答案 0 :(得分:32)

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

0.14 release note doc中提到:“添加了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

答案 1 :(得分:8)

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

我正在连接到我的Pipeline文件中的数据库,如果数据库连接不成功,我希望Spider停止爬行(如果无处发送数据,则无需收集数据)。我最终做的是使用:

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

这会导致Spider执行以下操作:

[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“文件。我不完全确定它在做什么,传递给函数的第一个数字是signame(例如,使用3,0而不是9,0返回错误[scrapy] INFO: Received SIGKILL...

似乎工作得很好。快乐的刮刮。

编辑: 我还假设您可以通过以下方式强制关闭程序:

import sys
sys.exit("SHUT DOWN EVERYTHING!")

答案 2 :(得分:0)

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

class MongoDBPipeline(object):

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

来源:Force spider to stop in scrapy

答案 3 :(得分:0)

尝试了很多选项,但无济于事。这个肮脏的骇客可以在Linux上发挥作用:

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

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