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

Mas*_*man 2 python scrapy

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

C:\wamp64\www\教程>

项目目录结构如下。

在此处输入图片说明

我想通过我的自定义 python 脚本runningpiders.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()
Run Code Online (Sandbox Code Playgroud)

当自定义python脚本从scrapy项目文件夹中运行时,蜘蛛可以正常运行,例如

C:\wamp64\www\tutorial>python runningpiders.py

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

C:\wamp64\www>python 教程/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'
Run Code Online (Sandbox Code Playgroud)

pau*_*rth 5

Scrapy spider 只是 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 路径中,这样import tutorial.spiders就意味着一些东西。

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

    process = CrawlerProcess({'SPIDER_MODULES': 'tutorial.spiders'})
Run Code Online (Sandbox Code Playgroud)

(前提是您已更新 Python 路径)

另一种研究是使用scrapy runspider /path/to/spider/module.py不需要 Scrapy 项目的方法。

您可能还想阅读配置选项(带有scrapy.cfg系统上其他地方的文件)或有关Scrapy 项目结构的信息