我尝试使用scrapy将我的抓取工具部署到scrapyd实例,但调用commend会返回以下错误:
服务器响应(200):{" status":"错误","消息":" AttributeError: ' NoneType'对象没有属性' 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会抛出这样的错误,但无论出于何种原因,它实际上都是null。我也没有" module_name"属性或任何试图在我自己的代码中引用它的东西。从本地scrapy运行爬虫可以正常工作,但不会部署鸡蛋。
答案 0 :(得分:6)
一个相当晚的答案,但我遇到了同样的问题并找到了解决方案。
通过查看来自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
并检查对设置的调用是否包含以下行:
packages=find_packages(),
entry_points={'scrapy': ['settings = scraper.settings']},
此处,scraper.settings
是scrapy项目设置文件的Python模块路径。将其更改为反映您的项目布局的那个,你应该是花花公子..
..如果没有,这里的关键是检查scrapyd
的输出(启用调试允许您在服务器响应中查看)以找到解决方案。
答案 1 :(得分:0)
您使用的是 scrapyd-client
包吗?如果是,那么您甚至不需要 setup.py
。我遇到了那个 AttributeError,因为我已经有了一个 setup.py
,所以我删除了。
答案 2 :(得分:-1)
这是一个编码错误,可能在您的mycrawler
模块中:
AttributeError: 'NoneType' object has no attribute 'module_name'
这意味着您正在尝试访问某个函数或方法返回的对象中的属性module_name
,但返回值为None
而不是对象(可能是函数或方法表明发生了错误。)
检查您的代码,查找在返回值中引用module_name
名称的地方。
或者可能scrapy
要求您定义并传递给它的其中一个对象必须定义module_name
属性,而您却忘记这样做。
最后,它可能是scrapy
中的错误。
但setuptools
不太可能出现问题。