无法在Zyte云部署Scrapy爬虫:AttributeError错误
Scrapy爬虫部署Zyte云失败排查与解决
问题描述
本地运行正常的Scrapy爬虫,部署到Zyte云时失败,核心报错如下:
警告: Setuptools正在替换distutils。 打包版本1.0 部署到Scrapy Cloud项目"615653" 部署日志最后30行: 部署日志位置: C:\Users\hp\AppData\Local\Temp\shub_deploy_4a5i8o6z.log 错误: 部署失败: b'{"status": "error", "message": "Internal error"}' 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/crawl.py", 第148行, 在_run_usercode中 _run(args, settings) 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/crawl.py", 第103行, 在_run中 _run_scrapy(args, settings) 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/crawl.py", 第111行, 在_run_scrapy中 execute(settings=settings) 文件 "/app/python/lib/python3.8/site-packages/scrapy/cmdline.py", 第149行, 在execute中 cmd.add_options(parser) 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/commands/shub_image_info.py", 第23行, 在add_options中 parser.add_option("--debug", action="store_true", AttributeError: 'ScrapyArgumentParser'对象没有属性'add_option' 回溯(最近的调用最后): 文件 "/usr/local/bin/shub-image-info", 第8行, 在<module>中 sys.exit(shub_image_info()) 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/crawl.py", 第209行, 在shub_image_info中 _run_usercode(None, ['scrapy', 'shub_image_info'] + sys.argv[1:], 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/crawl.py", 第148行, 在_run_usercode中 _run(args, settings) 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/crawl.py", 第103行, 在_run中 _run_scrapy(args, settings) 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/crawl.py", 第111行, 在_run_scrapy中 execute(settings=settings) 文件 "/app/python/lib/python3.8/site-packages/scrapy/cmdline.py", 第149行, 在execute中 cmd.add_options(parser) 文件 "/usr/local/lib/python3.8/site-packages/sh_scrapy/commands/shub_image_info.py", 第23行, 在add_options中 parser.add_option("--debug", action="store_true", AttributeError: 'ScrapyArgumentParser'对象没有属性'add_option' {"message": "shub-image-info退出码: 1", "details": null, "error": "image_info_error"} {"status": "error", "message": "内部错误"}
问题原因
这个错误是版本不兼容导致的:
- Scrapy在2.10及以上版本中,将命令行解析从
optparse切换到了argparse,对应的解析器类变成了ScrapyArgumentParser,不再支持add_option()方法(这是optparse的API)。 - 你使用的
sh_scrapy(Zyte部署工具shub的核心依赖)版本过旧,仍在调用add_option()方法,和新版本Scrapy不兼容。
解决方法
升级部署工具shub
执行以下命令更新到最新兼容版本:pip install --upgrade shub最新版的
shub已经适配了Scrapy的argparse解析器,会自动处理版本兼容问题。明确指定兼容版本组合
如果升级后仍有问题,在项目的requirements.txt中明确标注兼容的Scrapy和shub版本,比如:scrapy>=2.10.0,<2.12.0 shub>=2.16.0这样部署时Zyte云会安装指定的兼容版本。
检查自定义镜像(如果使用)
如果你是用自定义Docker镜像部署,确保镜像中安装的sh_scrapy和Scrapy版本匹配,不要混用新旧版本。可以在Dockerfile中添加版本指定:RUN pip install scrapy==2.10.5 shub==2.16.0
内容的提问来源于stack exchange,提问作者Azzedine
相关产品推荐
相关产品推荐

