Python 如何在满足管道条件后立即停止所有卡盘和发动机?

Python 如何在满足管道条件后立即停止所有卡盘和发动机?,python,scrapy,web-crawler,Python,Scrapy,Web Crawler,我们有一个用scrapy编写的系统来抓取一些网站。对于所有爬虫传递的所有项目,有几个爬虫,并且有几个级联管道。 其中一个管道组件向谷歌服务器查询地理编码地址。 谷歌对每个IP地址每天的请求限制为2500次,并威胁说,即使在谷歌回复警告信息“超过查询限制”后,如果谷歌仍继续查询谷歌的IP地址,谷歌也将禁止该IP地址 因此,我想知道我可以从管道中调用的任何机制,这些机制将完全并立即停止所有爬行器和主机的所有进一步爬行/处理 我检查了其他类似问题,但他们的答案不起作用: 这不起作用,因为爬行器停

我们有一个用scrapy编写的系统来抓取一些网站。对于所有爬虫传递的所有项目,有几个爬虫,并且有几个级联管道。 其中一个管道组件向谷歌服务器查询地理编码地址。 谷歌对每个IP地址每天的请求限制为2500次,并威胁说,即使在谷歌回复警告信息“超过查询限制”后,如果谷歌仍继续查询谷歌的IP地址,谷歌也将禁止该IP地址

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

我检查了其他类似问题,但他们的答案不起作用:

这不起作用,因为爬行器停止执行需要时间,因此会向google发出更多请求(这可能会禁止我的IP地址)

这个根本不起作用;尽管日志抛出sys.exit()->exceptions.SystemExit(无效),但项目不断生成并传递到管道

这一个与上述第一个案例的问题相同

我试过:

无济于事

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

从scrapy.contrib.closespider导入closespider

在我的管道范围内,我应该将什么作为“crawler”参数传递给CloseSpider的init()呢?

你可以关闭一个spider。 然而,我不认为这将从管道工作

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

在Scrapy用户组中也描述了类似的情况

我引述:

要关闭代码任何部分的爬行器,您应该使用
引擎。关闭\u spider
方法。查看此扩展以了解用法 例子:

您可以编写自己的扩展,同时以closespider.py为例,如果满足特定条件,它将关闭spider

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

管道:

def process_item(self, item, spider):
    if some_flag:
        spider.close_down = True
蜘蛛网:

def parse(self, response):
    if self.close_down:
        raise CloseSpider(reason='API usage exceeded')

谢谢你的来信。我认为这将像上面显示的第一个示例一样关闭spider,但这需要时间,并且每个预定spider中的一些项目仍将通过管道。这意味着在收到警告后,谷歌仍将收到100条查询。。。我怎么才能杀了整件事???如果根本没有办法,我就用“黑客”!谢谢!!!CloseSpider类还接受一个“crawler”参数。在我的管道及其范围内,应该传递什么对象?我不太确定您指的是什么;但是这个关于扩展的文档可能会有所帮助:和关于管道的文档:。我会将spider传递到管道,在那里设置标志,并在spider本身中引发CloseSpider异常。Scrapy是异步的,因此当您处理响应时,已经发出了大量额外的请求。即使你立即停止爬虫,也为时已晚,所以不要着急。多出几个100并不能让你得到谷歌的永久禁令。我只是在一个管道中提出了一个CloseSpider例外。
crawler.engine.close_spider(self, 'log message')
scrapy.project.crawler.engine.stop()
def process_item(self, item, spider):
    if some_flag:
        spider.close_down = True
def parse(self, response):
    if self.close_down:
        raise CloseSpider(reason='API usage exceeded')