python - Scrapyd 部署 "Attribute Error: NoneType object has no attribute ' 模块名称'”

标签 python scrapy egg scrapyd

我正在尝试使用 scrapy 将我的爬虫项目部署到 scrapyd 实例,但调用命令返回以下错误:

Server response (200): {"status": "error", "message": "AttributeError: 'NoneType' object has no attribute 'module_name'"}

这是我的 setup.py,用于构建在部署期间提交的 python egg:

from setuptools import setup, find_packages

setup(
    name = 'mycrawler',
    version = '0.1',
    packages = find_packages(),
    install_requires = [
        'scrapy',
        'PyMongo',
            'simplejson',
            'queue'
    ]
)

我的 scrapy.cfg:

[settings]
default = mycrawler.settings

[deploy:scrapyd_home_vm]
url = http://192.168.1.2:6800/
project = mycrawler

[deploy:scrapyd_local_vm]
url = http://192.168.38.131:6800/
project = mycrawler

我觉得这与鸡蛋的构建方式有关,但我不确定。我知道当您访问应该是对象的属性但由于某种原因实际上是 null 时,python 会抛出这样的错误。我也没有任何带有“module_name”属性的东西,也没有任何试图在我自己的代码中引用它的东西。在本地从 scrapy 运行爬虫工作得很好,但部署 egg 却不行。

最佳答案

一个相当晚的答案,但我遇到了同样的问题并找到了解决方案。

我的问题可以通过查看 scrapyd 本身发出的回溯找到:

Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/vagrant/venv/lib/python2.7/site-packages/scrapyd/runner.py", line 39, in <module>
    main()
  File "/home/vagrant/venv/lib/python2.7/site-packages/scrapyd/runner.py", line 34, in main
    with project_environment(project):
  File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/home/vagrant/venv/lib/python2.7/site-packages/scrapyd/runner.py", line 22, in project_environment
    activate_egg(eggpath)
  File "/home/vagrant/venv/local/lib/python2.7/site-packages/scrapyd/eggutils.py", line 13, in activate_egg
    settings_module = d.get_entry_info('scrapy', 'settings').module_name

AttributeError: 'NoneType' object has no attribute 'module_name'

如您所见,它正在尝试加载 scrapy 项目的 settings_module; module_name 属性不存在,因为 d.get_entry_info 正在返回 None 对象。

解决方案是检查用于生成 egg 的 setup.py 并检查对 setup 的调用是否包含以下行:

packages=find_packages(),
entry_points={'scrapy': ['settings = scraper.settings']},

这里,scraper.settings 是 scrapy 项目设置文件的 Python 模块路径。将其更改为反射(reflect)您的项目布局的一个,您应该是花花公子..

..如果没有,这里的关键是检查 scrapyd 的输出(启用调试允许您在服务器响应中看到它)以找到解决方案。

关于python - Scrapyd 部署 "Attribute Error: NoneType object has no attribute ' 模块名称'”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634733/

相关文章:

python - 如何以一定的精度存储数字?

python - Sphinx Autodoc 从文档字符串中跳过成员

python - 使用 scrapy 进行网页抓取。如何为数字定义 xpath 通配符?

Python interpteter 无法在 virtualenv 中找到模块,但 pip 看到它并且不会安装

python - 从列表列表中随机选择 X 个列表

java - 如何在没有 numpy 的情况下将 Python 代码转换为 Java

scrapy中Mysql语法错误

python - 如何跟踪Scrapy中已抓取的域名数量

python Egg开发环境搭建

python - 覆盖源代码中 setup.cfg 中的 DEFINE