scrapy 如何在raise CloseSpider后立刻停止?

重写了RetryMiddleware的process_exception方法。期望在遇到特定问题的时候直接停止爬取。

from scrapy.exceptions import CloseSpider

class CustomRetryMiddleware(RetryMiddleware):
    def process_exception(self, request, exception, spider):
        if xxx:
            raise CloseSpider('强制停止')
        

但是在实际运行时发现。在并发较高或者任务较多的情况下。在raise之后还会处理相当长一段时间的任务才会退出。

请问是我的raise 使用方法有问题,还是我哪里的配置需要修改?

.有哪位大佬知道怎么处理吗

阅读 6.9k
1 个回答

还记得settings.py中的CONCURRENT_REQUESTS = 16配置吗?
姑且当作是16个并发一起运行,当其中一个协程抛出异常(CloseSpider('强制停止')),他只会把自己给停止。所以要等到其他十五个协程都抛出异常之后整个爬虫才能退出。

这十六个并发没有完成请求但url却被保存到xxx:dupefilter去重队列中去。所以以后这十六个url都不再会被请求了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题