你是对的,Scrapy 默认并没有直接提供终止 或暂停 爬虫的命令。这是因为 Scrapy 的设计更倾向于一次性运行任务,而不是像传统服务那样长期运行。不过,你可以通过以下方法实现爬虫的暂停 和终止 :
1. 终止爬虫
(1)手动终止
- 在终端中运行爬虫时,按下
Ctrl + C可以终止爬虫。 - 这会触发 Scrapy 的关闭信号,爬虫会正常关闭并保存状态(如果配置了持久化)。
(2)编程终止
在爬虫代码中,可以通过抛出 CloseSpider 异常来主动终止爬虫:
from scrapy.exceptions import CloseSpider
class MySpider(scrapy.Spider):
name = 'myspider'
def parse(self, response):
if some_condition:
raise CloseSpider('终止爬虫,因为条件已满足')
2. 暂停爬虫
(1)使用 JOBDIR 暂停和恢复
Scrapy 支持通过 JOBDIR 参数将爬虫状态保存到磁盘,从而实现暂停和恢复。
-
启动爬虫并设置 JOBDIR :
bash scrapy crawl myspider -s JOBDIR=jobs/myspider-1 -
JOBDIR是一个目录路径,用于保存爬虫的状态(如请求队列、去重过滤器等)。 -
暂停爬虫 : 按下
Ctrl + C终止爬虫,Scrapy 会自动将状态保存到JOBDIR目录。 -
恢复爬虫 : 再次运行相同的命令,Scrapy 会从
JOBDIR中恢复状态:bash scrapy crawl myspider -s JOBDIR=jobs/myspider-1
(2)编程暂停
在爬虫代码中,可以通过设置标志位来暂停爬虫的逻辑:
class MySpider(scrapy.Spider):
name = 'myspider'
paused = False
def parse(self, response):
if self.paused:
return # 暂停爬虫逻辑
# 正常爬取逻辑
if some_condition:
self.paused = True # 设置暂停标志
3. 使用 Scrapyd 管理爬虫
如果你将爬虫部署到 Scrapyd (Scrapy 的官方托管服务),可以通过 Scrapyd 的 API 来管理爬虫的启动、暂停和终止。
(1)启动爬虫
curl http://localhost:6800/schedule.json -d project=myproject -d spider=myspider
(2)终止爬虫
curl http://localhost:6800/cancel.json -d project=myproject -d job=JOB_ID
(3)查看爬虫状态
curl http://localhost:6800/listjobs.json?project=myproject
4. 总结
- 终止爬虫 :
- 手动:按下
Ctrl + C。 - 编程:抛出
CloseSpider异常。 - 暂停爬虫 :
- 使用
JOBDIR参数保存和恢复状态。 - 编程:通过标志位控制爬虫逻辑。
- 使用 Scrapyd :
- 通过 Scrapyd 的 API 管理爬虫的启动、暂停和终止。
虽然 Scrapy 没有直接的暂停和终止命令,但通过以上方法,你可以灵活地控制爬虫的运行状态。