我们有一个系统,用刮擦来抓取几个网站。有几个蜘蛛,还有一个几个级联管道,用于所有爬虫传递的所有项目。管道组件之一查询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()?
发布于 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为例,如果满足了某个条件,它将关闭蜘蛛。
的另一个“黑客”是在管道中的蜘蛛上设置一个标志。例如:
管道:
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')https://stackoverflow.com/questions/9699049
复制相似问题