scrapy配置爬虫关闭的条件
在scrapy的默认配置文件中看到这四个配置:
CLOSESPIDER_TIMEOUT = 0
CLOSESPIDER_PAGECOUNT = 0
CLOSESPIDER_ITEMCOUNT = 0
CLOSESPIDER_ERRORCOUNT = 0
这四个配置是配置爬虫自动关闭条件的,等于0代表不开启。
CLOSESPIDER_TIMEOUT
默认值: 0
一个整数值,单位为秒。如果一个spider在指定的秒数后仍在运行, 它将以 closespider_timeout 的原因被自动关闭。 如果值设置为0(或者没有设置),spiders不会因为超时而关闭。
CLOSESPIDER_ITEMCOUNT
缺省值: 0
一个整数值,指定条目的个数。如果spider爬取条目数超过了指定的数, 并且这些条目通过item pipeline传递,spider将会以 closespider_itemcount 的原因被自动关闭。
CLOSESPIDER_PAGECOUNT
缺省值: 0
一个整数值,指定最大的抓取响应(reponses)数。 如果spider抓取数超过指定的值,则会以 closespider_pagecount 的原因自动关闭。 如果设置为0(或者未设置),spiders不会因为抓取的响应数而关闭。
CLOSESPIDER_ERRORCOUNT
缺省值: 0
一个整数值,指定spider可以接受的最大错误数。 如果spider生成多于该数目的错误,它将以 closespider_errorcount 的原因关闭。 如果设置为0(或者未设置),spiders不会因为发生错误过多而关闭。
但是,这里存在一个问题,比如:配置CLOSESPIDER_ERRORCOUNT,在实际运行时发现。在并发较高或者任务较多的情况下。在raise之后还会处理相当长一段时间的任务才会退出。这是怎么回事呢?
还记得settings.py中的CONCURRENT_REQUESTS = 16配置吗?
姑且当作是16个并发一起运行,当其中一个协程抛出异常(CloseSpider('强制停止')),他只会把自己给停止。所以要等到其他十五个协程都抛出异常之后整个爬虫才能退出。
另一种理解:当其中一个request或者response抛出异常(CloseSpider('强制停止')),他关闭的是scrapy框架中的引擎,调度器的任务队列还有15个request没有处理掉,之后会继续处理剩下的request对象,然后才结束爬取数据。
所以,如果你需要在关闭爬虫的时候也保存对应的爬取进度,即保存已经爬取过的url,就会遇到这样一个问题,你想在抛出一定数量的异常后自动关闭爬虫并且保存爬取进度,但抛出一定的异常后还是会继续爬取数据,没有立刻停下来,他还会爬取剩下没有请求的url,没有完成的请求url被保存到xxx:dupefilter去重队列中去了。所以自动关闭之后的url都不再会被请求了,这时保存下来的爬取进度是不准确的。