我对如何存储所有蜘蛛感到困惑。这些蜘蛛将通过使用命令行调用和从
stdin
读取的项目输入 Apache NiFi 来使用。我还计划让这些蜘蛛的子集在单独的网络服务器上使用 scrapyrt 返回单个项目结果。我需要在具有不同项目模型的许多不同项目中创建蜘蛛。它们都有相似的设置(比如使用相同的代理)。
我的问题是构建我的 scrapy 项目的最佳方法是什么?
- 将所有蜘蛛放在同一个存储库中。 提供一个为项目加载器和项目管道创建基类的简单方法。
- 将我正在处理的每个项目的蜘蛛分组到单独的存储库中。 这样做的优点是允许项目成为每个项目的焦点,而不会被太大了。无法共享通用代码、设置、蜘蛛监视器 (spidermon) 和基类。尽管存在一些重复,但这感觉是最干净的。
- 仅打包我计划在 NiFi 存储库中使用非实时的蜘蛛和另一个存储库中的实时蜘蛛。 有一个优势,我可以将蜘蛛与实际使用它们但仍然集中/复杂化哪些蜘蛛与哪些项目一起使用的项目。
感觉正确的答案是#2。与特定程序相关的蜘蛛应该在自己的 scrapy 项目中,就像当你为项目 A 创建 Web 服务时,你不会说哦,我可以将项目 B 的所有服务端点扔到同一个服务中,因为那是我的所有服务都将驻留在其中,即使某些设置可能会重复。可以说,一些共享代码/类可以通过单独的包共享。
您觉得怎么样?你们是如何构建 scrapy 项目以最大限度地提高可重用性的?同一项目与单独项目的界限在哪里?它基于您的项目模型或数据源吗?
提出了有关如何构建 Scrapy 项目的一些很好的观点。虽然没有一个正确的答案,并且很大程度上取决于的具体需求,但我同意的观点, 选项 2(按项目对蜘蛛进行分组到单独的存储库中) 通常是最好的方法。
让我们更深入地了解原因以及如何缓解缺点:
选项 2 的优势:
- 模块化和组织性: 将蜘蛛与其各自的项目分组可以保持代码库的清洁、有条理和易于维护。当拥有许多蜘蛛时,这尤其重要。
- 隔离: 不同的项目可能需要不同的依赖项、设置或 Spidermon 配置。单独的存储库可以防止版本冲突并允许对每个项目进行定制。
- 所有权和责任感: 如果有不同的团队在不同的项目上工作,单独的存储库可以更轻松地管理代码所有权和责任感。
选项 2 的缺点:
- 代码重复: 可能会在项目之间遇到一些重复的代码,尤其是在设置、基类和实用程序函数方面。
- 共享代码的管理: 如果需要跨项目共享代码,则需要使用包管理器(如 pip)将其提取到单独的库中并进行管理。
缓解缺点:
- 用于共享代码的共享库: 为设置、基类、项目管道、实用程序函数和 Spidermon 配置创建一个单独的 Python 包。所有项目都可以安装此包作为依赖项。
- 使用 Cookiecutter 模板: 创建一个 Cookiecutter 模板,用于生成新的 Scrapy 项目,其中包含的标准设置、共享库和最佳实践。这可以减少设置新项目所需的工作量。
- Monorepo,如果适用: 如果在存储库管理方面遇到困难,请考虑使用 monorepo。Monorepos 允许在单个存储库中拥有多个项目,从而更轻松地管理依赖项和共享代码,同时仍保持一些隔离度。
何时考虑其他选择:
- 选项 1(所有蜘蛛都在一个存储库中): 如果的所有蜘蛛都密切相关且共享大量代码,这可能是一个不错的选择。但是,随着项目规模的扩大,保持代码库的有条理将变得越来越具有挑战性。
- 选项 3(按实时与非实时进行分组): 这可能是一个有效的选项,但它更多地与蜘蛛的部署而不是它们的组织方式相关。仍然可以在每个部署组中拥有多个项目。
最终,最佳方法取决于的项目规模、团队结构和个人喜好。从选项 2 开始,如果需要,以后可以随时调整。请记住要优先考虑模块化、可重用性和长期可维护性。
标签:python,web-scraping,scrapy From: 57861326