【问题标题】:Scrapy: why use pipelines?Scrapy:为什么要使用管道?
【发布时间】:2017-08-08 17:00:10
【问题描述】:

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

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

【问题讨论】:

  • 我还红了官方文档,但它没有回答我的问题。我知道我可以使用 Item Pipelines,它们的缺点是:它们需要一些样板代码,它们的优点是......什么?
  • 如果我在蜘蛛的数据库上写东西有什么问题?
  • 这没有什么问题,但是你用数据库逻辑污染了你的蜘蛛代码。如果你有两只蜘蛛怎么办?您是否复制/粘贴数据库逻辑?这就是管道的用武之地——你的蜘蛛返回字典文档,在管道中你可以应用一些清理逻辑或将它们插入数据库。
  • 我编辑了问题

标签: python scrapy web-crawler splash-screen


【解决方案1】:

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

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

【讨论】:

  • 另外,你可以编写一个抽象的蜘蛛类,你的所有蜘蛛都继承自该类。然后在那个抽象类中,你可以处理所有蜘蛛都相同的逻辑
猜你喜欢
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多