scrapy之爬虫暂停与恢复

对于爬虫而言,如果能够设置断点,停止后恢复运行可以继续从上次中断的点开始运行,无疑是一个友好的特性,实现原理无非是将中断信息持久化,scrapy是实现这个这个特性的,然鹅在这里踩坑了。

Scrapy: Jobs pausing and resuming crawls

参考文档戳上面

按照文档中的操作,只需要在scrapy crawl spider_name -s JOBDIR=job_dir/xxx后面加上设置JOBDIR变量的参数即可,然后发送一个停止的信号即可。

可是遇到了这样的问题,在发送完一次停止信号之后,程序没停,然后又发送了一次,程序强制被停,重启之后显示如下

23:00:22 [scrapy.core.engine] INFO: Spider opened
1
2
3
4
2019-09-05 23:00:22 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-09-05 23:00:22 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2019-09-05 23:00:22 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET https://www.privateproperty.com.ng/property-for-sale?sortby=listeddesc> (referer: None)
2019-09-05 23:00:22 [scrapy.core.engine] INFO: Closing spider (finished)

显示了一个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
2
3
4
5
6
7
8
9
10
11
12
13
等待退出
|____requests.queue
| |____active.json
| |____p0
|____requests.seen
|____spider.state

强制退出
.
|____requests.queue
| |____p0
|____requests.seen
|____spider.state

可见在目录结构上是有差异的。至于根本原因,需要阅读源码之后再给出答案,后续更新。