2

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

服务器响应 (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

我觉得这与鸡蛋的建造方式有关,但我不确定。我知道当您访问应该是对象的属性但无论出于何种原因实际上为空时,python 会引发这样的错误。我也没有任何“module_name”属性或任何试图在我自己的代码中引用它的东西。在本地从 scrapy 运行爬虫就可以了,但部署 egg 却不行。

4

3 回答 3

9

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

对我来说,问题可以通过查看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 对象。

解决方案是检查您setup.py用于生成鸡蛋的内容,并检查对 setup 的调用是否包含以下行:

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

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

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

于 2013-11-27T11:37:53.977 回答
0

你在用scrapyd-client包吗?如果是,那么您甚至不需要setup.py. 我遇到了那个AttributeError因为我已经有一个setup.py,所以我删除了。

于 2021-04-02T20:39:58.143 回答
-1

这是一个编码错误,可能在您的mycrawler模块中:

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

这意味着您正在尝试访问module_name由某个函数或方法返回的对象中的属性,但返回值None与对象相反(可能是函数或方法指示发生错误的方式)。

检查您的代码以查找您module_name在返回值中引用名称的位置。

或者它可能scrapy要求您定义并传递给它的对象之一必须具有module_name定义的属性,而您忘记了这样做。

最后,它可能是scrapy.

但它不太可能是一个问题setuptools

于 2013-01-31T20:54:03.507 回答