当前位置:   article > 正文

【闲谈】Scrapy分布式爬虫, Redis OR RabbitMQ 如何选?_scrapy rabbitmq

scrapy rabbitmq

Scrapy是一款强大的Python爬虫框架,支持分布式爬取,可以使用多种消息队列来实现任务调度,其中最常见的就是Redis和RabbitMQ。

Scrapy-Redis 和 Scrapy-RabbitMQ 都是 Scrapy 分布式爬虫框架的解决方案,可以实现基于 Redis 或 RabbitMQ 的分布式爬虫。这两种方案各有优缺点,选择哪种方案主要取决于项目的需求和实际情况。

Scrapy-Redis 方案的优点包括:

1. 简单易用:Scrapy-Redis 提供了一些基本的组件,使用起来比较简单。

2. 速度快:Scrapy-Redis 可以通过调整并发数、增加机器数量等方式来提高爬虫的速度。

3. 可扩展性好:Scrapy-Redis 使用 Redis 的 Pub/Sub 机制实现了消息传递,可以方便地扩展到多个节点。

Scrapy-RabbitMQ 方案的优点包括:

1. 稳定性好:RabbitMQ 的稳定性比 Redis 更好,能够更好地处理爬虫出错、消息丢失等问题。

2. 可靠性高:RabbitMQ 使用 ACK 机制,能够保证消息不会丢失,确保消息传递的可靠性。

3. 灵活性高:RabbitMQ 的消息传递机制更加灵活,可以方便地应对各种情况。

总的来说,选择哪种方案主要取决于项目的需求和实际情况。

下面是一些参考建议:

  1. 简单性 如果只需要简单的分布式爬取任务,可以考虑使用Redis。因为Redis使用起来比较简单,学习成本较低,可以快速部署和使用。

  2. 性能 如果需要处理大量的爬取任务,可以考虑使用RabbitMQ。因为RabbitMQ采用消息分发机制,能够支持高并发处理大量的消息,可以提高爬虫的抓取效率。

  3. 可靠性 如果需要实现可靠的消息传递,可以选择RabbitMQ。因为RabbitMQ支持消息持久化和消息确认机制,可以确保消息不丢失,同时保证消息被正确地处理。

  4. 应用场景 Redis适合应用场景相对简单的分布式爬虫,例如需要爬取多个网站的同一类数据,爬取速度不需要过快等。而RabbitMQ适合需要处理复杂、高并发的分布式爬虫任务,例如需要爬取大量动态页面或需要高速抓取的任务。

浅聊Scrapy-RabbitMQ

scrapy-redis对于有些江湖经验的老爬虫来说,早已轻车熟路,就不过多做介绍了,今天在这里简单说下Scrapy-RabbitMQ

RabbitMQ是一个消息队列软件,可以协调不同的应用程序之间的通信。

Scrapy-RabbitMQ简单使用:

1、环境准备

首先,需要安装Scrapy和pika(Python中的RabbitMQ客户端)。可以使用pip来安装这两个库:

  1. pip install scrapy
  2. pip install pika

2、定义消息队列

使用RabbitMQ需要先定义消息队列。

可以使用RabbitMQ提供的web管理界面创建队列,也可以使用pika库来创建队列。例如:

  1. import pika
  2. connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
  3. channel = connection.channel()
  4. channel.queue_declare(queue='task_queue', durable=True)

这里创建了一个名为"task_queue"的队列,并设置队列为持久化,以便在RabbitMQ服务重启后保留队列和其中的消息。

3、定义Scrapy爬虫

在Scrapy中,需要定义一个Spider类来指定要爬取的URL、数据抓取规则等。下面是一个简单的例子:

  1. import scrapy
  2. import pika
  3. class MySpider(scrapy.Spider):
  4. name = 'my_spider'
  5. def start_requests(self):
  6. urls = [
  7. 'http://www.example.com/page1.html',
  8. 'http://www.example.com/page2.html',
  9. 'http://www.example.com/page3.html',
  10. ]
  11. for url in urls:
  12. yield scrapy.Request(url=url, callback=self.parse)
  13. def parse(self, response):
  14. # 爬虫收集到的数据
  15. data = {
  16. 'url': response.url,
  17. 'title': response.css('title::text').get(),
  18. 'content': response.css('div.content::text').get(),
  19. }
  20. # 将数据发送到RabbitMQ队列中
  21. connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
  22. channel = connection.channel()
  23. channel.queue_declare(queue='task_queue')
  24. channel.basic_publish(exchange='', routing_key='task_queue', body=str(data))
  25. connection.close()

这里将数据作为消息内容,加入到名为"task_queue"的队列中,并设置消息为持久化。

4、定义RabbitMQ的消息消费者

  1. import pika
  2. from scrapy import signals
  3. from scrapy.crawler import CrawlerProcess
  4. from scrapy.utils.project import get_project_settings
  5. class MySpider(scrapy.Spider):
  6. name = "myspider"
  7. def start_requests(self):
  8. yield scrapy.Request(self.url)
  9. def parse(self, response):
  10. # 解析网页内容,提取数据
  11. pass
  12. def consume_callback(ch, method, properties, body):
  13. url = body.decode()
  14. process = CrawlerProcess(get_project_settings())
  15. process.crawl(MySpider, url=url)
  16. process.start()
  17. connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
  18. channel = connection.channel()
  19. channel.queue_declare(queue='task_queue', durable=True)
  20. channel.basic_qos(prefetch_count=1)
  21. channel.basic_consume(queue='task_queue', on_message_callback=consume_callback)
  22. channel.start_consuming()

这里使用basic_consume函数来监听名为"task_queue"的队列中的消息,并将consume_callback函数作为回调函数传入。最后使用start_consuming函数来开始监听队列中的消息并执行回调函数。

5、部署Scrapy爬虫

将Scrapy爬虫部署到多个节点上,以实现分布式爬虫的效果。在每个节点上都运行一个RabbitMQ消费者,以处理从队列中接收到的数据。

6、运行Scrapy爬虫

在每个节点上运行Scrapy爬虫,收集数据并将其发送到RabbitMQ队列中。爬虫运行的命令可以使用以下方式来启动:

scrapy crawl my_spider

7、监控爬虫运行情况

使用RabbitMQ的Web管理界面或者CLI命令来监控队列的长度,以及消费者的运行情况。可以使用以下命令来监控队列的长度:

sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged

以上是一个基于Scrapy和RabbitMQ构建分布式爬虫程序的简单实例代码。当然,实际上还需要更多的细节来确保程序的正确运行,比如在爬虫中处理异常情况、保证数据传输的安全性、定义Spider时需要根据具体的网站编写相应的解析规则,生产者需要将待爬取的URL加入到消息队列中,消费者需要启动多个实例来提高爬取效率等。

备注:

以上均为简单测试代码,不可用于生产环境,仅提供分布式构建思想,实际应用中,还需配合中间件、Pipeline等进行融合使用。

➣➣欢迎关注本人微信公众号:Anonymous NoteBook➣➣

分享好玩有趣的网络资源&软件工具~

分享各种技术性PDF资源/付费查询PDF资源~

分享各种编程语言、开发技术、分布式事务、大数据与云计算技术~

分享有关网络爬虫(Web爬虫逆向 | 安卓逆向)案例、数据挖掘、技术心得等~
————————————————

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/208660
推荐阅读
相关标签
  

闽ICP备14008679号