Scrapyd 部署 "属性错误:NoneType对象没有'模块名'属性

2 投票
3 回答
2900 浏览
提问于 2025-04-17 14:21

我正在尝试使用scrapy把我的爬虫项目部署到一个scrapyd实例上,但执行命令时出现了以下错误:

服务器响应 (200): {"status": "error", "message": "AttributeError: 'NoneType'对象没有'模块名称'这个属性"}

这是我在部署时用来构建python egg的setup.py:

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

我感觉这个问题可能和egg的构建方式有关,但我不太确定。我知道当你试图访问一个本该是对象的属性,但实际上却是空值(null)时,python会抛出这样的错误。我在自己的代码中没有任何带有"模块名称"属性的东西,也没有尝试引用它的地方。在本地运行爬虫时,scrapy工作得很好,但部署egg时却不行。

3 个回答

-1

这是一个编码错误,可能出现在你的 mycrawler 模块里:

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

这意味着你在尝试访问一个对象的 module_name 属性,而这个对象是某个函数或方法返回的,但返回的结果是 None,也就是说并没有返回一个有效的对象(这通常表示函数或方法发生了错误)。

检查一下你的代码,看看在哪里引用了返回值中的 module_name

或者可能是 scrapy 要求你定义并传递给它的某个对象必须有 module_name 这个属性,而你可能忘记定义了。

最后,也有可能是 scrapy 本身的一个bug。

不过,问题出在 setuptools 的可能性非常小。

0

你在用 scrapyd-client 这个包吗?如果是的话,其实你根本不需要一个 setup.py 文件。我遇到过 AttributeError 这个错误,因为我已经有了一个 setup.py 文件,所以我把它删掉了。

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 项目的设置模块;但是 module_name 属性不存在,因为 d.get_entry_info 返回的是 None 对象。

解决办法是检查你的 setup.py 文件,这个文件用于生成 egg 包,并确保其中包含以下几行代码:

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

这里的 scraper.settings 是指向 scrapy 项目设置文件的 Python 模块路径。你需要把它改成符合你项目结构的路径,这样就没问题了。

如果还是不行,关键是要检查 scrapyd 的输出(开启调试模式可以在服务器响应中看到这些信息),这样可以帮助你找到解决方案。

撰写回答