Skip to main content
 首页 » 编程设计

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

2025年05月04日17mate10pro

我正在尝试使用 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 的输出(启用调试允许您在服务器响应中看到它)以找到解决方案。