Scrapy-deploy部署到Scrapyd时没有安装setup.py中指定的依赖项。

3

我有一个使用Scrapy编写的项目。这个爬虫在setup.py中有很多要求。以下是一个简单的示例。我运行

scrapyd-deploy

并且会产生以下输出。
Packing version 1506254163
Deploying to project "quotesbot" in http://localhost:6800/addversion.json
Server response (200):
......................... [CUTTED TRACEBACK] ...........
\"/private/var/folders/xp/c949vlsd14q8xm__dv0dx8jh0000gn/T/quotesbot-1506254163-e50lmcfx.egg/quotesbot/spiders/toscrape-css.py\",
 line 4, in <module>\n
ModuleNotFoundError: No module named 'sqlalchemy'\n"}

但是

setup.py in the same directory:

# Automatically created by: scrapyd-deploy

from setuptools import setup, find_packages

setup(
    name         = 'quotesbot',
    version      = '1.0',
    packages     = find_packages(),
    entry_points = {'scrapy': ['settings = quotesbot.settings']},
    install_requires=[
        'scrapy-splash',
         [ SOME REQUIREMENTS]
        'sqlalchemy'
    ],
)

这是蜘蛛的新部署还是重新部署? - Tarun Lalwani
这是蜘蛛的初始部署。有史以来第一次。 - lovesuper
2个回答

5

我查看了scrapyd的源代码,发现它不运行你项目中的setup.py文件。它只是解压包含依赖信息但不包含依赖本身的egg文件。以下是addversion API的代码:

class AddVersion(WsResource):

    def render_POST(self, txrequest):
        project = txrequest.args[b'project'][0].decode('utf-8')
        version = txrequest.args[b'version'][0].decode('utf-8')
        eggf = BytesIO(txrequest.args[b'egg'][0])
        self.root.eggstorage.put(eggf, project, version)
        spiders = get_spider_list(project, version=version)
        self.root.update_projects()
        UtilsCache.invalid_cache(project)
        return {"node_name": self.root.nodename, "status": "ok", "project": project, "version": version, \
            "spiders": len(spiders)}

self.root.eggstorage.put(eggf, project, version)之后,它基本上只是提取了egg,并直接运行了spiders = get_spider_list(project, version=version),因此没有进行任何设置。
因此,要么您的egg需要包含所有依赖项,这意味着您不会使用scrapyd-deploy构建egg。我找不到太多文档来查看是否可能。
所以你看到的是由于srapyd缺乏实现。您应该在http://github.com/scrapy/scrapyd/上打开错误或增强请求。

1
这个问题有一个解决方案:https://github.com/scrapy/scrapyd/issues/246 - e-j5

1
scrapyd文档的"包含依赖项"一节中,它说:

如果您的项目有其他依赖项,则可以将其安装在Scrapyd服务器上,或者可以在项目的egg中包含它们,具体分为两个步骤:

  • 在项目的根目录下创建requirements.txt文件
  • 在构建或部署项目时使用--include-dependencies选项:

    scrapyd-deploy --include-dependencies
  • 当它说要将requirements.txt放在项目根目录中时,指的是爬虫项目根目录。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接