Scrapy项目重启报错:'CrawlerRunner'对象无'spiders'属性
解决Scrapy中CrawlerRunner无spiders属性的AttributeError错误
问题详情
我之前开发了一个Scrapy项目,现在想重启它。项目包含多个爬虫,我编写了一个主脚本批量启动所有爬虫,之前运行正常,但现在出现错误:AttributeError: 'CrawlerRunner' object has no attribute 'spiders'
原脚本代码
from scrapy.crawler import CrawlerRunner from scrapy.utils.log import configure_logging from scrapy.utils.project import get_project_settings from twisted.internet import reactor from LesInfosDuJour.pipelines import LesinfosdujourPipeline configure_logging() settings = get_project_settings() runner = CrawlerRunner(settings) for spider_name in runner.spiders.list(): runner.crawl(spider_name) d = runner.join() d.addBoth(lambda _: reactor.stop()) reactor.run() obj = LesinfosdujourPipeline() obj.empty_procedure() obj.duplicate_procedure()
项目配置与结构
settings.py相关配置:
SPIDER_MODULES = ['LesInfosDuJour.spiders'] NEWSPIDER_MODULE = 'LesInfosDuJour.spiders'
- 项目目录结构:
Scrap/LesInfosDuJour/spiders
解决方案
问题根源是CrawlerRunner本身并没有spiders属性,大概率是Scrapy版本更新导致的API变化。要获取项目中所有爬虫名称,改用Scrapy官方提供的SpiderLoader工具即可。
修改后的脚本代码:
from scrapy.crawler import CrawlerRunner from scrapy.utils.log import configure_logging from scrapy.utils.project import get_project_settings from scrapy.utils.spiderloader import SpiderLoader from twisted.internet import reactor from LesInfosDuJour.pipelines import LesinfosdujourPipeline configure_logging() settings = get_project_settings() # 通过SpiderLoader加载项目内所有爬虫 spider_loader = SpiderLoader(settings) spider_names = spider_loader.list() runner = CrawlerRunner(settings) for spider_name in spider_names: runner.crawl(spider_name) d = runner.join() d.addBoth(lambda _: reactor.stop()) reactor.run() obj = LesinfosdujourPipeline() obj.empty_procedure() obj.duplicate_procedure()
说明
SpiderLoader会读取settings.py中SPIDER_MODULES配置,自动从指定路径下查找并返回所有爬虫的名称列表。- 替换原代码中
runner.spiders.list()的调用方式,改用spider_loader.list()即可解决属性不存在的错误。 - 你的
SPIDER_MODULES配置已经正确指向爬虫目录,无需额外调整。
内容的提问来源于stack exchange,提问作者Ayoub
相关产品推荐
相关产品推荐

