Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从项目目录的外侧运行scrapy raise异常_Python_Scrapy - Fatal编程技术网

Python 从项目目录的外侧运行scrapy raise异常

Python 从项目目录的外侧运行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

我在下面的目录中有一个粗略的项目“教程”

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


  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')的部分非常重要。