Scrapy:为什么要使用管道?

Scrapy: why use pipelines?

我在 Scrapy+Splash 中有一个可用的爬虫。它在许多页面上启动蜘蛛。每个页面都包含一个链接列表。对于每个页面,蜘蛛都会下载该页面,然后从该页面链接一些页面(不是递归的)。所有页面都保存在文件系统中。该系统完美无缺。目前我正在重构它以添加一些数据库交互。 我没有使用物品,也没有使用物品管道。 使用它们有什么好处?

添加一些信息: 我的爬虫的目的是下载整个页面(html、png 或使用库转换为 txt)。一旦蜘蛛有了要保存的 response,它就会将其传递给封装所有 io 操作(文件系统和数据库)的库。所以在这种方式下,它比使用项目(带有用于转换的样板)和管道更简单。 那么我的疑问在哪里? 我不知道 scrapy 内部工作的方式是否足够好。爬虫的实现方式是将 io 操作执行到蜘蛛的线程中。所以每个蜘蛛需要更长的时间来执行。相反,如果我将 io 操作移动到管道中,也许(?)scrapy 可以更好地安排其作业,将它们与爬行作业分开执行。会有任何真正的性能差异吗?

在我看来,使用管道只是遵循separation of concerns原则。你的蜘蛛可以做很多事情,但它的核心功能是从网页中提取信息。其余部分可以(也可能应该)重构为管道或扩展。

如果您的一个网站只有一个蜘蛛,则可能不是这样的问题。但是想象一下你有一个 Scrapy 项目,其中有数百个蜘蛛,用于语义相似的网站,并且你想对每个项目应用相同的逻辑——获取页面快照、检查重复项、存储在数据库中等。现在想象一下维护地狱如果您在每个蜘蛛中都有所有逻辑,并且必须更改该逻辑。