ani*_*etd 12 python web-crawler scrapy
我们有一个用scrapy编写的系统来抓取一些网站.有几个蜘蛛,以及所有爬虫传递的所有物品的一些级联管道.其中一个管道组件向Google服务器查询地理编码地址.谷歌每个IP地址每天限制2500个请求,并且如果谷歌继续查询谷歌,即使谷歌已经回复了警告信息:'OVER_QUERY_LIMIT',也有可能禁止IP地址.
因此,我想知道我可以在管道中调用的任何机制,它将完全并立即停止所有进一步爬行/处理所有蜘蛛以及主引擎.
我检查了其他类似的问题,他们的答案没有奏效:
Run Code Online (Sandbox Code Playgroud)from scrapy.project import crawler crawler._signal_shutdown(9,0) #Run this if the cnxn fails.
这不起作用,因为蜘蛛停止执行需要时间,因此谷歌提出了更多的请求(可能会禁止我的IP地址)
Run Code Online (Sandbox Code Playgroud)import sys sys.exit("SHUT DOWN EVERYTHING!")
这个根本不起作用; 项目不断生成并传递给管道,虽然日志呕吐sys.exit() - > exceptions.SystemExit引发(无效)
Run Code Online (Sandbox Code Playgroud)crawler.engine.close_spider(self, 'log message')
这个问题与上面提到的第一种情况有同样的问题.
我试过了:
Run Code Online (Sandbox Code Playgroud)scrapy.project.crawler.engine.stop()
无济于事
编辑:如果我在管道中:
来自scrapy.contrib.closespider导入CloseSpider
我应该将什么作为'crawler'参数从我的管道范围传递给CloseSpider的init()?
Sja*_*aak 16
您可以引发CloseSpider异常以关闭蜘蛛.但是,我认为这不会起作用.
编辑:avaleske在对此答案的评论中指出,他能够从管道中引发CloseSpider异常.最明智的是使用它.
我引用:
要为代码的任何部分关闭蜘蛛,您应该使用
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')
| 归档时间: | 
 | 
| 查看次数: | 6615 次 | 
| 最近记录: |