消息队列在爬虫开发上的应用

发布时间丨2021-10-15 11:46:46作者丨zhaomeng浏览丨113


1.什么是消息队列

消息队列一般可以作为数据缓存,在实际应用上用来存储经常需要交互的数据,以此提高访问数据的速度及提高网站的用户体验。

2.有哪些数据库是消息队列

redis、MQ、celery、mongodb等

3.为什么使用消息队列

在爬虫中使用消息队列可以开发分布式爬虫,也是分部式爬虫中很重要的技术。目前的分布式爬虫架构主要以redis为主,原因在于缓存的速度快,数据可持久化。常规的爬虫使用的是内存缓存的方式,只有在爬虫运行时,数据暂存在内存中,这样的爬虫速度也是很快的,但是由于数据不可持久化的存储,当出现断网、断电、外力因素导致爬虫中断,甚至挂掉。就会造成不可估量的损失。数据可能丢失,导致数据需要重头开始采集。这样的结果是项目不可接受的。因此使用缓存数据库就能体现出它的重要性及其价值。缓存的优势在于,拥有比拟内存的读取速度,拥有内存没有的数据可以持久化。这两点就足以提升整个爬虫架构的效率。当上诉问题发生时,数据可以完整保存在数据库中,实现断电/点续爬的强大优势能力。

4.消息队列怎么使用

缓存的使用,这里不讲代码的使用,讲讲我在项目中用到的场景。建立一个完整的分布式爬虫,就必须要用到分布式的redis,他可以在用户和爬虫之间建立起一道持久的连接。当用户通过接口的形式发送带采集的数据给爬虫的时候,我们的爬虫需要轮寻的方式获取数据,代码上的轮序一定会耗费内存资源的,尤其是在爬虫很多的时候这时我们就可以使用redis的数据结构作为我们的数据共享的消息队列来完成数据的交互。分布式爬虫就是这样来的。但是我这里主要想表达的是多个不同的爬虫接受用户发来的数据。一种方法是使用大量的判断语句去调度大量的爬虫。另一种方式是使用redis的发布订阅来实现一点对多点(非多个相同爬虫)爬虫的架构。第一种情况我们使用redis的数据结构来实现,但是随着爬虫的数量增多,我们的调度的爬虫判断语句就不断增加,这不是一个最佳的方法。最佳的方法是可以实现消息队列和爬虫的独立,爬虫不用去关心用户发什么数据,只需要按照约定的数据格式,接受数据就可以,那么这样的一对多源爬虫的架构,按照规定的数据格式发送接受数据就可以将代码大大简化,减少了很多的判断冗余的代码。用户只管发送数据,爬虫只管接收数据,实现了爬虫与用户的完全隔离,也实现了爬虫独立的初衷。redis的订阅发布功能在这里与爬虫完美的结合起来,将判断交给每一个爬虫。实现用户操作、消息收发队列、爬虫开发、数据存储每个环节的独立。

5.消息队列的应用场景

应用场景主要是在设计大数据量高效率的爬虫。分布式的核心就是待采集数据的共享,多个爬虫一起消耗消息队列里面的数据。这大大提高了数据的采集速度,以及爬虫的效率。另一种场景,是结合全栈的开发,多个数据源需要多个爬虫,每个爬虫数据格式统一规则不一,这样就需要使用消息队列作为数据的缓存,来实现数据的共享以及数据的持久化,用户不需要关心数据的发送,数据的发送转换成了异步的传输,爬虫开发者不需要关注每个爬虫接受的数据是哪个,存储只负责存储采集到的数据,这样各个某块各司其职,发挥各自功能,组成一个高效的爬虫架构。不管是删除爬虫还是新增爬虫,其他爬虫都不受到任何影响有,不需要停止也不需要更新爬虫。这将大大有利于数据采集效率的提升以及提升用户的体验感。

推荐文章:基于flask开发VPS切换IP接口