对于爬虫而言,如果能够设置断点,停止后恢复运行可以继续从上次中断的点开始运行,无疑是一个友好的特性,实现原理无非是将中断信息持久化,scrapy是实现这个这个特性的,然鹅在这里踩坑了。
Scrapy: Jobs pausing and resuming crawls
参考文档戳上面
按照文档中的操作,只需要在scrapy crawl spider_name -s JOBDIR=job_dir/xxx
后面加上设置JOBDIR变量的参数即可,然后发送一个停止的信号即可。
可是遇到了这样的问题,在发送完一次停止信号之后,程序没停,然后又发送了一次,程序强制被停,重启之后显示如下
1 | 2019-09-05 23:00:22 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) |
显示了一个filtered duplicate request之后就停止退出了,什么鬼?然后在搜索相关的问题,发现给出的都不是想要的答案,最后在stackoverflow上发现得分很低的答案。
1 | If you click Ctrl+C twice (force stop) it won't be able to be continued. Click Ctrl+C just once and wait. |
试着做了,果然发送一个信号后等程序停止了重新恢复后就可以继续运行。
上面说原理也就是保存断点的信息,对比一下强退和等待退出的目录结构:
1 | 等待退出 |
可见在目录结构上是有差异的。至于根本原因,需要阅读源码之后再给出答案,后续更新。