scrapy配置爬虫关闭的条件(一)

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都不再会被请求了,这时保存下来的爬取进度是不准确的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值