Scrapy - 仅使用 RabbitMQ 或 Celery + RabbitMQ 来抓取多个网站?

Scrapy - Use RabbitMQ only or Celery + RabbitMQ for scraping multiple websites?

我想运行多个蜘蛛抓取许多不同的网站。我要抓取的网站需要不同的时间才能被抓取(有些需要大约 24 小时,有些需要 4 小时,...)。我有多个工作人员(少于网站数量)来启动 scrapy 和一个队列,我将要抓取的网站放在其中。一旦工作人员完成对网站的抓取,网站将返回队列等待工作人员启动 scrapy,依此类推。 问题是小网站会比大网站被抓取更多次,我希望所有网站被抓取的次数相同。

我正在考虑使用 RabbitMQ 进行队列管理并确定某些网站的优先级。 但是当我搜索 RabbitMQ 时,它通常与 Celery 一起使用。我对这些工具的理解是,Celery 将允许根据计划启动一些代码,而 RabbitMQ 将使用消息和队列来定义执行顺序。

就我而言,我不知道仅使用没有 Celery 的 RabbitMQ 是否可行。另外,使用 RabbitMQ 对我的问题有帮助吗?

谢谢

是的,使用 RabbitMQ 对您的用例非常有帮助,因为您的爬行代理可以利用消息队列来存储结果,而您的文档处理器随后可以将结果存储在您的数据库后端(在此回复中,我将假设 mongodb) 和您的搜索引擎(我将在这里假设弹性搜索)。

在这种情况下得到的是一个非常快速和动态的搜索引擎和爬虫,可以扩展。

至于celery+rabbitmq+scrapy部分; celery 将是一个很好的方式来安排你的 scrapy 爬虫并在你的基础设施中分发你的爬虫机器人。 Celery 只是使用 RabbitMQ 作为后端来整合和分配每个实例之间的作业。因此,对于同时使用 celery 和 scrapy 的用例,只需为您的 scrapy 机器人编写代码以使用其自己的 rabbitmq 队列来存储结果,然后编写一个文档处理器以将结果存储到您的持久数据库后端。然后设置 celery 来安排站点抓取的批次。投入 sched 模块以在您的爬行计划中保持一点理智。

另外,查看在 google 完成的工作,了解他们如何解决在他们的算法中过度抓取网站的问题,并尊重合理的 robots.txt 设置,您的抓取工具应该可以正常运行。