Python 从项目目录的外侧运行scrapy raise异常
我在下面的目录中有一个粗略的项目“教程” C:\wamp64\www\tutorial> 项目目录结构如下所示 我想通过自定义python脚本runspider.py运行spiderPython 从项目目录的外侧运行scrapy raise异常,python,scrapy,Python,Scrapy,我在下面的目录中有一个粗略的项目“教程” C:\wamp64\www\tutorial> 项目目录结构如下所示 我想通过自定义python脚本runspider.py运行spider from __future__ import print_function import scrapy from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings
from __future__ import print_function
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
def main():
process = CrawlerProcess(get_project_settings())
process.crawl("quotes")
process.start()
if __name__ == '__main__' : main()
当自定义python脚本从scrapy项目文件夹中运行时,爬行器将正确运行,例如
C:\wamp64\www\tutorial>python runspider.py
File "C:\Python27\lib\site-packages\scrapy\spiderloader.py", line 43, in load
raise KeyError("Spider not found: {}".format(spider_name))
KeyError: 'Spider not found: quotes'
但是当自定义python脚本从项目文件夹外运行时,scrapy会引发以下异常,例如
C:\wamp64\www>python教程/runspider.py
File "C:\Python27\lib\site-packages\scrapy\spiderloader.py", line 43, in load
raise KeyError("Spider not found: {}".format(spider_name))
KeyError: 'Spider not found: quotes'
Scrapy爬行器仅仅是Python类(Scrapy.Spider的子类),因此您的脚本需要知道在哪里可以找到这些类,就像您在脚本中使用的任何其他Python类或模块一样 在Scrapy项目中,您有一个
Scrapy.cfg
文件,它至少做了一件事:它告诉框架在哪里可以找到项目设置。对于教程项目,它是tutorial.settings
在设置中,Scrapy希望有SPIDER\u模块
告诉它哪些模块包含SPIDER类。对于教程,这是tutorial.spider
在项目内部运行脚本时,get\u project\u settings()
会为您执行所有这些操作,以发现设置模块并读取SPIDER\u模块
,因为其中有一个scrapy.cfg
文件
在tutorial/
文件夹之外,您没有scrapy.cfg
。您的Python脚本可能也不知道tutorial.spider的意思
首先,您可以将/path/to/tutorial/tutorial
添加到您的中,以便导入tutorial.spider
将具有某种意义
但是您也不需要依赖于get\u project\u settings()
,因为您不在一个零碎的项目文件夹中。但是,您可以更改为
process = CrawlerProcess({'SPIDER_MODULES': 'tutorial.spiders'})
(前提是您已经更新了Python路径)
另一种研究方法是使用不需要零碎的项目
您可能还想阅读(系统上其他地方的
scrapy.cfg
文件)或关于。对于新手,在这个答案中关于process=CrawlerProcess({'SPIDER\u MODULES':'tutorial.SPIDER')的部分非常重要。