【问题标题】:Where should I bind the db/redis connection to on scrapy?我应该在哪里将 db/redis 连接绑定到 scrapy?
【发布时间】:2020-07-10 17:36:48
【问题描述】:

抱歉打扰各位了。这是一个不好的问题,似乎真正让我感到困惑的是 ItemPipeline 如何在 scrapy 中工作。我将关闭它并开始一个新问题。


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

在scrapy 文档中,mongo db connection is bind on Pipeline。但它也可能是bound to the Spider(这也是扩展scrapy-redis 所做的)。后面的解决方案带来的好处是除了管道之外,蜘蛛可以在更多地方访问,比如中间件。

那么,哪种方法更好呢?

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

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

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

正如文档所说,ItemPipeline 是并行运行的。如何?是否有重复的 ItemPipeline 实例在线程中运行。 (我注意到 FilesPipeline 使用延迟线程将文件保存到 s3)。或者每个管道只有一个实例并在主事件循环中运行。如果是后一种情况,连接池似乎没有帮助。因为当你使用 redis 连接时,它被阻塞了。一次只能使用一个连接。

【问题讨论】:

  • 始终用于连接任何网络,首选网络池或连接池,因为您可以同时使用多个连接

标签: python web-scraping scrapy web-crawler scrapy-pipeline


【解决方案1】:

了解 scrapy 架构在这方面的重要性。看下图

蜘蛛

Spider 是 Scrapy 用户编写的自定义类,用于解析响应并从中提取项目(也称为抓取的项目)或其他 URL(请求)以进行跟踪。每个蜘蛛都能够处理一个特定的域(或一组域)。

项目管道

项目管道负责在项目被蜘蛛提取(或抓取)后对其进行处理。典型任务包括清理、验证和持久性(例如将项目存储在数据库中)。

了解以上架构图后,Scraper 类用于抓取网站,item pipeline 类用于处理item(抓取的请求)。

这里有两种情况:

  1. 当您从任何数据库中获取网址时

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

  1. 当您要处理抓取的项目时 - 存储数据等。

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

根据场景,将数据库连接绑定到 Scraper 类和 Pipeline 类都是正确的。

问题 2:

首选redis/db的连接池?

是的,任何数据库的连接池总是首选。

连接池维护一个通常稳定的有效/打开连接集合,假设为 10。当应用程序需要运行查询或进行更新时,它通过“打开”连接从池中“借用”连接.完成后,它会“关闭”连接,并将其返回到池中以供下一个请求使用。由于连接已经打开,因此获取连接没有任何开销。

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

【讨论】:

  • 感谢您的帮助。但是我已经阅读了整个scrapy文档,答案并没有解释scrapy是如何异步运行的。正如文档所说,ItemPipeline 是并行运行的。如何?是否有重复的 ItemPipeline 实例在线程中运行。 (我注意到FilesPipeline 使用延迟线程将文件保存到 s3 中)。或者每个管道只有一个实例并在主事件循环中运行。如果是后一种情况,连接池似乎没有帮助。因为当你使用redis连接时,它被阻塞了。
  • @Simba 据我了解,您的问题由 3 个问题组成。在哪里绑定数据库? itemPipelines 是否并行运行?首选redis/db的连接池?我相信我已经回答了 2 个问题
  • 抱歉把太多问题搞砸了。我想我真正想知道的是scrapy是如何异步运行的,具体来说ItemPipeline部分是如何工作的。考虑到问题标题,您确实回答正确。我会接受答案并开始一个关于管道是什么的新问题。
【解决方案2】:

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

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

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

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

抱歉,这个我帮不上忙。

【讨论】:

  • 感谢您的帮助。我认为真正让我感到困惑的是“ItemPipelines 如何并行运行”,正如文档所说的那样。它仍然在事件循环中运行还是在线程中启动?此外,我已经看到包scrapy-redis 中的RedisSpider 类在蜘蛛上绑定了redis conn。如果蜘蛛和 itempipeline 在同一个事件循环中运行并且 itempipeline 被初始化一次,我认为连接池没有任何帮助。因为在使用redis的时候,进程是阻塞的。
猜你喜欢
  • 2013-12-15
  • 2012-01-29
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2017-07-10
  • 2019-02-10
  • 1970-01-01
相关资源
最近更新 更多