scrapy引发异常从项目目录的外侧运行

时间:2016-12-14 16:20:28

标签: python scrapy

我有一个scrapy项目' 教程'在以下目录中

C:\ wamp64 \ WWW \教程>

项目目录结构如下。

enter image description here

我想通过自定义python脚本运行蜘蛛 runspiders.py

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 runspiders.py

但是当自定义python脚本从项目文件夹外部运行时,scrapy会引发以下异常,例如

C:\ wamp64 \ www> python tutorial / runspiders.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'

1 个答案:

答案 0 :(得分:1)

Scrapy spiders仅仅是Python类(scrapy.Spider的子类),因此您的脚本需要知道在哪里找到这些类,就像您在脚本中使用的任何其他Python类或模块一样。

在Scrapy项目中,你有一个scrapy.cfg文件,至少做一件事:它告诉框架在哪里找到项目设置。对于教程项目,它是tutorial.settings

在设置中,Scrapy希望SPIDER_MODULES告诉它哪些模块包含蜘蛛类。对于本教程,这是tutorial.spiders

在项目中运行脚本时,get_project_settings()会为您完成所有这些操作,以发现设置模块并阅读SPIDER_MODULES,因为它有一个scrapy.cfg文件。

tutorial/文件夹之外,您没有scrapy.cfg。而你的Python脚本也可能不知道tutorial.spiders的意思。

首先,您可以将/path/to/tutorial/tutorial添加到Python path,这样import tutorial.spiders就意味着什么。

但是您还需要不依赖get_project_settings(),因为您不在Scrapy项目文件夹中。但是,您可以更改为

    process = CrawlerProcess({'SPIDER_MODULES': 'tutorial.spiders'})

(如果您已更新Python路径)

另一种选择是使用不需要Scrapy项目的scrapy runspider /path/to/spider/module.py

您可能还想阅读configuration options(系统中其他位置的scrapy.cfg个文件)或Scrapy project structure的文件。