process.spider_loader.list()为空列表是什么原因导致的?KeyError: ‘Spider not found
process.spider_loader.list()为空列表是什么原因导致的?
报错
Traceback (most recent call last):
File "D:\Softwares\Python37\lib\site-packages\scrapy\spiderloader.py", line 75, in load
return self._spiders[spider_name]
KeyError: 'End_ShangYong'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:/Softwares/PyCharm Community Edition 2022.3/plugins/python-ce/helpers/pydev/pydevd.py", line 1496, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:\Softwares\PyCharm Community Edition 2022.3\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "C:\Users\Administrator\Desktop\FTX_Spider\FTX_Spider\crawl_a.py", line 153, in <module>
run("河北省")
File "C:\Users\Administrator\Desktop\FTX_Spider\FTX_Spider\crawl_a.py", line 130, in run
process.crawl('End_ShangYong',city1)
File "D:\Softwares\Python37\lib\site-packages\scrapy\crawler.py", line 219, in crawl
crawler = self.create_crawler(crawler_or_spidercls)
File "D:\Softwares\Python37\lib\site-packages\scrapy\crawler.py", line 252, in create_crawler
return self._create_crawler(crawler_or_spidercls)
File "D:\Softwares\Python37\lib\site-packages\scrapy\crawler.py", line 327, in _create_crawler
spidercls = self.spider_loader.load(spidercls)
File "D:\Softwares\Python37\lib\site-packages\scrapy\spiderloader.py", line 77, in load
raise KeyError(f"Spider not found: {spider_name}")
KeyError: 'Spider not found: End_ShangYong'
python-BaseException
在 Scrapy 框架中,process.spider_loader.list()
方法返回一个列表,其中包含了 Scrapy 项目中所有可用的 Spider 的名称。
如果该方法返回一个空列表,通常有以下几种可能的原因:
- 没有定义 Spider:检查 Scrapy 项目中是否有定义 Spider,或者是否在正确的位置定义了 Spider。
- Spider 名称无效:确保 Spider 的名称被正确设置,并使用正确的名称调用 Spider。
- 配置不正确:确保 Scrapy 配置文件中正确配置了爬虫的名称和属性。
如果您认为您的 Spider 已经正确的定义和配置,但还是出现了 process.spider_loader.list()
返回空列表的问题,可以考虑检查以下几点:
- 项目设置:确保项目的设置正确,特别是
SPIDER_MODULES
和NEWSPIDER_MODULE
设置。
SPIDER_MODULES = ['XnSpider.spiders']
NEWSPIDER_MODULE = 'XnSpider.spiders'
我这里是这个问题,代码在修改log设置的setting中误触删除掉了。
- Spider 命名:确保 Spider 的名称符合 Scrapy 的命名规则,例如名称全局唯一、使用下划线命名、避免与默认方法名称重复。
- Spider 文件位置:确保 Spider 文件位于正确的位置,并且没有拼写错误。
- 导入错误:检查 Spider 文件的导入,确保导入没有错误。
- 日志输出:将日志等级设置为
DEBUG
,查看输出是否提供了有关错误的更多详细信息。
如果以上步骤都没有解决问题,可以尝试重新创建 Scrapy 项目,并确保所有依赖项都是最新的。
测试
根据搜索结果,**KeyError: 'Spider not found:**是一个常见的错误,可能有以下原因:
- 你运行的spider名称和你在spider文件中定义的name属性不一致1。你需要确保两者相同,例如scrapy crawl myspider和name = ‘myspider’。
- 你没有在项目目录下运行scrapy命令2 3。你需要切换到包含scrapy.cfg文件的目录下,例如myproject/,然后运行scrapy命令。
- 你的项目结构不正确3 4。你需要将你的spider文件放在项目目录下的spiders子目录中,例如myproject/spiders/myspider.py,并且确保你的spider类是有效的。
SPIDER_MODULES的settings设置是什么?
SPIDER_MODULES
是 Scrapy 项目的配置之一,它指定 Scrapy 项目中存放 Spider 的模块名称。在 Scrapy 中,Spider 是用来抓取和处理网页的主要组件。
SPIDER_MODULES
配置项通常定义在 Scrapy 项目的 settings.py
文件中,它是一个 Python 列表,列出 Scrapy 项目中包含 Spider 的模块名称,例如:
SPIDER_MODULES = ['myproject.spiders']
上述代码中,SPIDER_MODULES
指定了 Scrapy 项目中存放 Spider 的模块名称为 myproject.spiders
,这意味着 Scrapy 会去 myproject
目录下查找名为 spiders
的子目录,以及该子目录下的所有 Python 模块文件作为 Scrapy 项目中可用的 Spider。
如果用户想要将这些 Spider 放在不同的目录中,也可以将多个模块名称添加到 SPIDER_MODULES
列表中,例如:
SPIDER_MODULES = ['myproject.spiders', 'anotherproject.spiders']
上述代码中,SPIDER_MODULES
列表中包含了 myproject.spiders
和 anotherproject.spiders
两个模块名称,这意味着 Scrapy 会在两个目录下查找名为 spiders
的子目录,以及这两个子目录下的所有 Python 模块文件作为 Scrapy 项目中可用的 Spider。
需要注意的是,如果将 Spider 放在非默认目录中,也必须在 settings.py
文件中指定 NEWSPIDER_MODULE
配置项,该配置项指定 Scrapy 项目中新 Spider 的模块名称,例如:
NEWSPIDER_MODULE = 'myproject.newspiders'
上述代码中,NEWSPIDER_MODULE
指定了 Scrapy 项目中新 Spider 的模块名称为 myproject.newspiders
,这意味着 Scrapy 项目在创建新的 Spider 时,会在名为 myproject.newspiders
的模块中查找新的 Spider。