强迫我的scrapy蜘蛛停止爬行

no1*_*no1 32 python scrapy

如果条件为真,则有可能在特定情况下停止抓取(例如scrap_item_id == predefine_value).我的问题类似于Scrapy - 如何识别已经刮掉的网址,但是我想在发现最后一个被抓住的项目后"强迫"我的scrapy蜘蛛停止爬行.

Sja*_*aak 34

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

0.14发行说明中提到了doc:"添加了CloseSpider异常以手动关闭蜘蛛(r2691)"

根据文档示例:

def parse_page(self, response):
  if 'Bandwidth exceeded' in response.body:
    raise CloseSpider('bandwidth_exceeded')
Run Code Online (Sandbox Code Playgroud)

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

  • 它成功地强制停止,但速度不够快.它仍然允许一些请求运行.我希望Scrapy将来会提供更好的解决方案. (3认同)

alu*_*ach 9

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

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

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

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

[scrapy] INFO: Received SIGKILL, shutting down gracefully. Send again to force unclean shutdown.
Run Code Online (Sandbox Code Playgroud)

在阅读你的评论并查看"/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!")
Run Code Online (Sandbox Code Playgroud)

  • 扩展程序的链接已关闭 (3认同)
  • 感谢您提及扩展 - 现在它真的是要走的路.以下是文档:http://readthedocs.org/docs/scrapy/en/0.12/topics/extensions.html#module-scrapy.contrib.closespider (2认同)