我应该在哪里绑定 db/redis 连接到 scrapy?

Where should I bind the db/redis connection to on scrapy?

抱歉打扰大家了。这是个糟糕的问题,似乎真正让我困惑的是 ItemPipeline 在 scrapy 中的工作方式。我会关闭它并开始一个新问题。


我应该在哪里绑定 db/redis 连接到 scrapy,SpiderPipeline

在 scrapy 文档中,mongo db connection is bind on Pipeline. But it could be also be (这也是扩展 scrapy-redis 所做的)。后来的解决方案带来的好处是蜘蛛可以在除了管道之外的更多地方访问,比如中间件。

那么,哪种方法更好?

我对管道是 运行 并行感到困惑(这是文档所说的)。这是否意味着 MyCustomPipeline 有多个实例?

另外,首选redis/db的连接池?

我只是缺乏做决定的现场经验。需要你的帮助。提前致谢。

As the doc says, ItemPipeline is run in parallel. How? Are there duplicate instances of the ItemPipeline run in threads. (I noticed FilesPipeline uses deferred thread to save files into s3). Or there's only one instance of each pipeline and runs in the main event loop. If it's the later case, the connection pool doesn't seems to help. Cause when you use a redis connection, it's blocked. Only one connection could be used at the same time.

最佳做法是在管道中绑定连接,以遵循 separation of concerns 原则。

Scrapy 使用相同的并行基础结构来执行请求和处理项目,当您的蜘蛛生成项目时,scrapy 将从管道实例调用 process_item 方法。 Check it here.

在蜘蛛实例化期间实例化每个管道的单个实例。

Besides, connection pool of redis/db is preferred?

抱歉,这件事我帮不上什么忙。

了解 scrapy 架构在这里更为重要。看下图

蜘蛛

蜘蛛是由 Scrapy 用户编写的自定义 classes,用于解析响应并从中提取项目(又名抓取的项目)或要遵循的其他 URL(请求)。每个蜘蛛都能够处理特定的域(或域组)。

项目管道

一旦项目被蜘蛛提取(或抓取),项目管道负责处理项目。典型任务包括清理、验证和持久化(如将项目存储在数据库中)。

当你理解了上面的架构图后,Scraper classes 用于抓取网站和项目管道 classes 用于处理项目(抓取的请求)。

这里有两种情况:

  1. 当您从任何数据库获取 url 时

在这里,为了抓取网站,您需要网站的网址。如果这些 url 存储在任何数据库中,那么最好将数据库连接对象绑定到 scraper classes 以便可以动态获取它们。

  1. 当你想处理抓取的项目时 - 存储数据等..

这里基本上就是把数据库连接对象绑定到Item Pipeline上,这样我们就可以直接把抓取到的数据存储到数据库中了。

将数据库连接绑定到 Scraper class 和管道 class 都是正确的,具体取决于场景。

问题二:

首选 redis/db 的连接池?

是的,连接到任何数据库的连接池始终是首选。

连接池维护着一个通常稳定的 valid/open 连接集合,假设有 10 个。当应用程序需要 运行 查询或进行更新时,它会“借用”来自通过“打开”连接来访问池。完成后,它会“关闭”连接,returns 连接到池中供下一个请求使用。由于连接已经打开,因此获取连接没有开销。

来源:https://qr.ae/pNs8jA