一、问题描述
博主在搞一个scrapy 爬虫项目时,前几天一直正常,但某一天开始,运行 scrapy shell 或者 scrapy list 或者 scrapy crawl 之类命令时,完全没有显示退出!!没报任何错误!! 我开始时怀疑是不是软件出错,但重装scrapy还是不行,并且不在项目目录下执行时执行scrapy shell 也是没有问题的,这是怎么回事呢??
全网找了N多资料, 都没有找到答案,搞了很长时间都未能解决,最后数日痛苦查找,终于发现问题所在!
二、问题原因
1.背景知识
scrapy 项目比如说scrapy_project目录下,有个也叫scrapy_project目录,这个目录下有个spider 的目录,里面就是真正运行的爬虫,类似如下结构
scrapy_project
----scrapy_project
--------spider
2.问题真正原因:
scrapy 命令有两种运行模式,目录模式 和 非目录模式,当我们敲命令,终端当前目录:
- 不在项目目录时
这时候属于“无项目模式”,这个时候 scrapy shell正常运行,scrapy list 则正确报错说无项目
- 在项目目录时(项目目录包含scrapy.cfg文件)时
这时候就是“项目”模式了,项目将会读取scrapy.cfg中的配置设置环境。这时比如说敲你 scrapy list, scrapy将检索 spider目录下的爬虫,检测爬虫是否有错误,注意是每一个!如果你爬虫spider类中有类变量赋值之类的语句,会执行,如果执行出错,则会报错!问题是,假如你在这段类似赋值的语句中有 try catch 之类语句捕获了这个报错,那你赋值过程即便有错都不显示,那你麻烦了!这将会导致scrapy list 直接退出,无任何显示!爬虫菜鸟----我的爬虫就是这样,赋值过程出错了并catch了这个错误,导致错误无法发现。
好吧,这个还算比较容易理解的,毕竟要list肯定要检查爬虫嘛
但是,假如你执行 scrapy shell 命令,你以为这个只是开个shell而已,是跟具体爬虫无关的,那你就错了,但scrapy 竟然也跟上面一样,也会逐一检查spider目录下爬虫是否正确,逐一去执行类似类变量赋值的语句!这个多余动作让人难以理解,也正是我踩坑的原因!
三、解决办法
简单,确认每个爬虫是否正确。如果你的爬虫有类似类赋值的语句,要确认是否正确,而且要确认是否有错误捕捉而无显示的!
爬虫菜鸟踩坑记,估计很少人会有这么“高端”的错误吧,不过记下来供不幸踩坑的你看看。