强制我的scrapy爬虫停止爬取

36 投票
4 回答
33332 浏览
提问于 2025-04-16 08:34

有没有办法在特定条件满足时停止爬虫,比如当 scrap_item_id 等于预先定义的值时?我的问题和这个 Scrapy - 如何识别已经爬取的链接 类似,但我想要“强制”我的 Scrapy 爬虫在发现最后一个爬取的项目后停止爬取。

4 个回答

3

在处理数据的过程中,我更喜欢以下这个解决方案。

class MongoDBPipeline(object):

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

来源:在Scrapy中强制爬虫停止

12

这个问题是在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!")
44

在最新版本的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

撰写回答