首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在满足管道条件后立即停止所有蜘蛛和引擎?

如何在满足管道条件后立即停止所有蜘蛛和引擎?
EN

Stack Overflow用户
提问于 2012-03-14 09:25:01
回答 1查看 8.6K关注 0票数 14

我们有一个系统,用刮擦来抓取几个网站。有几个蜘蛛,还有一个几个级联管道,用于所有爬虫传递的所有项目。管道组件之一查询google服务器的地理编码地址。谷歌规定,每天每个IP地址的请求不得超过2500个,并威胁说,即使在谷歌发出警告信息:‘OVER_’之后,如果它继续查询谷歌,它也将禁止使用IP地址。

因此,我想知道我可以从管道中调用的任何机制,这些机制将使完全立即停止,所有蜘蛛和主机都将进一步爬行/处理。

我曾核对过其他类似的问题,但这些问题的答案并没有奏效:

从scrapy.project导入爬虫crawler._signal_shutdown(9,0) #,如果cnxn失败,运行它。

这是行不通的,因为蜘蛛停止执行需要时间,因此会向google提出更多的请求(这可能会禁止我的IP地址)。

导入sys sys.exit(“关闭一切!”)

这个程序根本不起作用;项目一直被生成并传递到管道中,尽管日志会吐出sys.exit() -> exceptions.SystemExit (无效)

crawler.engine.close_spider(self,“日志消息”)

这个问题与上面提到的第一个案例有同样的问题。

我试过:

scrapy.project.crawler.engine.stop()

徒劳无功

编辑:如果我在管道中这样做:

从scrapy.contrib.closespider导入CloseSpider

我应该从管道的范围内将什么作为“爬虫”参数传递给CloseSpider的init()?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-14 09:40:19

你可以用引发CloseSpider异常关闭蜘蛛。然而,我不认为这会在管道中起作用。

编辑:雪崩在对此答案的评论中指出,他能够从管道中引发CloseSpider异常。最明智的做法是使用这个。

在Scrapy用户组在这条线上。上也描述了类似的情况。

我引述如下:

若要关闭代码中任何部分的爬行器,应使用engine.close_spider方法。有关用法示例,请参阅此扩展:https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/closespider.py#L61

您可以编写自己的扩展,同时以closespider.py为例,如果满足了某个条件,它将关闭蜘蛛。

的另一个“黑客”是在管道中的蜘蛛上设置一个标志。例如:

管道:

代码语言:javascript
复制
def process_item(self, item, spider):
    if some_flag:
        spider.close_down = True

蜘蛛:

代码语言:javascript
复制
def parse(self, response):
    if self.close_down:
        raise CloseSpider(reason='API usage exceeded')
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9699049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档