如何在Scrapy爬虫出现抓取错误时自动停止运行?
Scrapy异常自动停止实现方案
方案1:使用内置CloseSpider扩展(快速配置)
Scrapy自带的官方扩展可直接通过配置触发自动停止,适配请求失败类场景:
- 在项目
settings.py中添加如下配置即可生效:# 累计出现N次请求错误后自动停止,可自定义数值 CLOSESPIDER_ERRORCOUNT = 3 - 也可以启动时直接传参临时生效,命令如下:
scrapy crawl <spider_name> -s CLOSESPIDER_ERRORCOUNT=3
方案2:自定义逻辑(适配抓取不到目标元素的场景)
如果需要判断元素提取是否有效,需在爬虫代码中添加判断逻辑,调用引擎接口直接停止爬虫:
请求失败时自动停止
给请求添加errback错误回调,触发异常时直接停止:
import scrapy class DemoSpider(scrapy.Spider): name = "demo" def start_requests(self): yield scrapy.Request( url="目标URL", callback=self.parse, errback=self.handle_error ) def handle_error(self, failure): self.logger.error(f"请求出错:{repr(failure)}") # 直接停止爬虫 self.crawler.engine.close_spider(self, reason="请求异常")
未抓取到目标元素时自动停止
在解析回调中加提取结果判断,无有效结果时停止:
def parse(self, response): # 提取目标元素,此处可替换为你自己的提取逻辑 target_items = response.xpath("//div[@class='target']/text()").getall() if not target_items: self.logger.error("未提取到任何目标元素,自动停止") self.crawler.engine.close_spider(self, reason="无有效抓取结果") # 正常逻辑处理 for item in target_items: yield {"content": item}
小提示:启动命令保持原有写法即可,注意替换正确的爬虫名称:
scrapy crawl <spider_name>
内容的提问来源于stack exchange,提问作者Mohsen Mahmoodzadeh
相关产品推荐
相关产品推荐

