【问题标题】:Python Scrapy tutorial KeyError: 'Spider not found:Python Scrapy 教程 KeyError: 'Spider not found:
【发布时间】:2014-10-14 11:20:59
【问题描述】:

我正在尝试编写我的第一个scrapy spider,我一直在关注http://doc.scrapy.org/en/latest/intro/tutorial.html 上的教程但是我收到一个错误“KeyError: 'Spider not found:”

我想我正在从正确的目录(带有 scrapy.cfg 文件的目录)运行命令

(proscraper)#( 10/14/14@ 2:06pm )( tim@localhost ):~/Workspace/Development/hacks/prosum-scraper/scrapy
   tree
.
├── scrapy
│   ├── __init__.py
│   ├── items.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── juno_spider.py
└── scrapy.cfg

2 directories, 7 files
(proscraper)#( 10/14/14@ 2:13pm )( tim@localhost ):~/Workspace/Development/hacks/prosum-scraper/scrapy
   ls
scrapy  scrapy.cfg

这是我遇到的错误

(proscraper)#( 10/14/14@ 2:13pm )( tim@localhost ):~/Workspace/Development/hacks/prosum-scraper/scrapy
   scrapy crawl juno
/home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/twisted/internet/_sslverify.py:184: UserWarning: You do not have the service_identity module installed. Please install it from <https://pypi.python.org/pypi/service_identity>. Without the service_identity module and a recent enough pyOpenSSL tosupport it, Twisted can perform only rudimentary TLS client hostnameverification.  Many valid certificate/hostname mappings may be rejected.
  verifyHostname, VerificationError = _selectVerifyImplementation()
Traceback (most recent call last):
  File "/home/tim/.virtualenvs/proscraper/bin/scrapy", line 9, in <module>
    load_entry_point('Scrapy==0.24.4', 'console_scripts', 'scrapy')()
  File "/home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/scrapy/cmdline.py", line 143, in execute
    _run_print_help(parser, _run_command, cmd, args, opts)
  File "/home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/scrapy/cmdline.py", line 89, in _run_print_help
    func(*a, **kw)
  File "/home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/scrapy/cmdline.py", line 150, in _run_command
    cmd.run(args, opts)
  File "/home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/scrapy/commands/crawl.py", line 58, in run
    spider = crawler.spiders.create(spname, **opts.spargs)
  File "/home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/scrapy/spidermanager.py", line 44, in create
    raise KeyError("Spider not found: %s" % spider_name)
KeyError: 'Spider not found: juno'

这是我的虚拟环境:

(proscraper)#( 10/14/14@ 2:13pm )( tim@localhost ):~/Workspace/Development/hacks/prosum-scraper/scrapy
   pip freeze
Scrapy==0.24.4
Twisted==14.0.2
cffi==0.8.6
cryptography==0.6
cssselect==0.9.1
ipdb==0.8
ipython==2.3.0
lxml==3.4.0
pyOpenSSL==0.14
pycparser==2.10
queuelib==1.2.2
six==1.8.0
w3lib==1.10.0
wsgiref==0.1.2
zope.interface==4.1.1

这是我的蜘蛛的代码,其中填写了 name 属性:

(proscraper)#( 10/14/14@ 2:14pm )( tim@localhost ):~/Workspace/Development/hacks/prosum-scraper/scrapy
   cat scrapy/spiders/juno_spider.py 
import scrapy

class JunoSpider(scrapy.Spider):
    name = "juno"
    allowed_domains = ["http://www.juno.co.uk/"]
    start_urls = [
        "http://www.juno.co.uk/dj-equipment/"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        with open(filename, 'wb') as f:
            f.write(response.body)

【问题讨论】:

  • /home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/twisted/internet/_sslverify.py:184:用户警告:您没有安装 service_identity 模块。请从 pypi.python.org/pypi/service_identity> 安装它。如果没有 service_identity 模块和足够新的 pyOpenSSL 来支持它,Twisted 只能执行基本的 TLS 客户端主机名验证。许多有效的证书/主机名映射可能会被拒绝。你需要安装那个模块
  • 我认为这不会影响命令的查找
  • 好的,我安装了它pip install service_identity我仍然得到同样的错误
  • 尝试像这样重新创建您的项目:scrapy startproject junoproject scrapy genspider juno juno.co.uk 在您发布时编辑您的蜘蛛,然后再次运行。我可以很好地运行这个
  • 我不会使用items.pysettings.py 等将文件夹称为“scrapy”。选择另一个名字

标签: python scrapy


【解决方案1】:

当您以 scrapy 作为项目名称启动项目时,它会创建您打印的目录结构:

.
├── scrapy
│   ├── __init__.py
│   ├── items.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── juno_spider.py
└── scrapy.cfg

但是使用 scrapy 作为项目名称有附带效果。如果您打开生成的scrapy.cfg,您将看到您的默认设置指向您的scrapy.settings 模块。

[settings]
default = scrapy.settings

当我们 cat scrapy.settings 文件时,我们看到:

BOT_NAME = 'scrapy'

SPIDER_MODULES = ['scrapy.spiders']
NEWSPIDER_MODULE = 'scrapy.spiders'

嗯,这里没什么奇怪的。机器人名称,Scrapy 将在其中查找蜘蛛的模块列表,以及使用 genspider 命令创建新蜘蛛的模块。到目前为止,一切顺利。

现在让我们检查一下 scrapy 库。它已正确安装在 /home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/scrapy 目录下的 proscraper 隔离 virtualenv 下。请记住,site-packages 始终添加到 sys.path,其中包含 Python 搜索模块的所有路径。所以,你猜怎么着...scrapy 库还有一个settings 模块/home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/scrapy/settings 导入/home/tim/.virtualenvs/proscraper/lib/python2.7/site-packages/scrapy/settings/default_settings.py,它保存所有设置的默认值。特别注意默认SPIDER_MODULES入口:

SPIDER_MODULES = []

也许您开始了解正在发生的事情。选择 scrapy 作为项目名称还会生成一个scrapy.settings 模块,它与scrapy 库scrapy.settings 发生冲突。这里是在sys.path 中插入相应路径的顺序将使Python 导入其中一个或另一个。最先出现获胜。在这种情况下,scrapy 库设置获胜。因此KeyError: 'Spider not found: juno'

要解决此冲突,您可以将项目文件夹重命名为另一个名称,例如 scrap

.
├── scrap
│   ├── __init__.py

修改您的scrapy.cfg 以指向正确的settings 模块:

[settings]
default = scrap.settings

并更新您的 scrap.settings 以指向正确的蜘蛛:

SPIDER_MODULES = ['scrap.spiders']

但正如@paultrmbrth 建议的那样,我会用另一个名称重新创建项目。

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多