意外退出后如何从断点恢复Scrapy爬虫运行?
Scrapy断点续爬与稳定性优化方案
一、实现内置断点续爬(Resuming Crawls)
Scrapy内置的断点续爬靠请求队列持久化实现,核心是将待处理请求、已爬请求指纹等状态存到本地目录,重启后直接从该目录恢复,操作步骤如下:
- 启动爬虫时指定
JOBDIR参数,该参数会自动创建目录存储状态数据:scrapy crawl your_spider_name -s JOBDIR=./crawl_state - 关键注意点:
JOBDIR指定的目录必须为空,或是上一次爬虫中断时生成的状态目录,不能复用非空目录- 保留默认的
DUPEFILTER_CLASS = 'scrapy.dupefilters.RFPDupeFilter',它会配合JOBDIR记录已爬请求的指纹,避免重复抓取 - 动态生成的请求(如依赖响应数据生成的详情页请求)只要已进入调度队列,中断后重启都会从状态目录恢复
- 不要手动修改
JOBDIR内的文件,否则会导致状态紊乱
二、手动存储分类状态无效的原因及改进方案
你之前用数据库存分类“进行中/已完成”状态失效,核心问题是Scrapy并发调度与状态更新不同步:多并发请求可能同时修改同个分类状态,或请求失败后未及时更新状态,导致重启后逻辑混乱。
如果要基于分类实现续爬,需结合内置的JOBDIR和数据库状态:
- 启动爬虫时,先从数据库读取已完成的分类列表
- 在
start_requests方法中,仅生成未完成分类的初始请求 - 当某个分类的所有请求(列表页、详情页等)处理完成后,再将该分类标记为“已完成”存入数据库
这种方式既利用JOBDIR实现请求级的断点续爬,又通过数据库实现分类级的进度管控,避免重复爬取已完成的分类
三、限制并发请求数提升爬虫稳定性
限制并发请求数是提升爬虫稳定性的有效手段,过高的并发易引发目标网站反爬拦截、本地网络过载或爬虫组件崩溃。调整方式如下:
在settings.py中修改以下参数:
CONCURRENT_REQUESTS:全局最大并发请求数,默认16,针对大型网站可降至8-12,根据目标网站反爬强度灵活调整CONCURRENT_REQUESTS_PER_DOMAIN:单个域名的最大并发数,默认8,建议设为4-6,避免给目标服务器造成过大压力CONCURRENT_REQUESTS_PER_IP:单个IP的最大并发数,若目标网站为多IP部署,该参数比域名并发限制更有效,默认0(无限制),可设为2-4- 配合下载延迟参数效果更佳:
DOWNLOAD_DELAY = 1 # 每个请求间隔1秒 RANDOMIZE_DOWNLOAD_DELAY = True # 随机延迟0.5-1.5倍DOWNLOAD_DELAY时长,降低被识别为爬虫的概率
内容的提问来源于stack exchange,提问作者Waqas Arain
相关产品推荐
相关产品推荐

