分布式爬行和速率限制/流量控制



我正在运行一个与网络爬虫配合使用的利基搜索产品。当前的爬网程序是一个单独的(PHP Laravel(工作人员对url进行爬网,并将结果放入弹性搜索引擎。系统以X毫秒为间隔不断地对找到的url进行重新爬网。

这对我很有帮助,但随着一些新的大客户的出现,爬虫将达到极限。我需要将系统重新设计为分布式爬网程序,以加快爬网速度。问题在于以下规格的组合。

系统必须遵守以下2条规则:

  1. 多个工作程序(并发问题(
  2. 每个客户的可变利率限制。我需要非常确定系统不会对客户端X进行超过每X毫秒一次的爬网

我尝试过的:

  • 我尝试将url放在MySQL表中,并让工作人员根据客户端和url表中的last_crawled_at时间戳查询要爬网的url。但是MySQL不喜欢多个并发工作线程,我会收到各种各样的死锁。

  • 我试着把url放到Redis引擎中。我有点工作,但只是使用了一个Lua脚本,该脚本检查并为正在服务的每个客户端设置一个过期密钥。这一切都让人觉得有点生气。

  • 我想过填充一个常规队列,但这将违反第2条规则,因为我不能100%确定工作人员是否可以"实时"处理队列。

有人能解释一下大男孩是怎么做到的吗?我们如何让多个进程根据一些标准(如客户端的速率限制(查询一个大/大量的url列表,并确保我们只将url分发给一个工作人员?

理想情况下,除了Elastic之外,我们不需要另一个数据库,其中包含所有可用/找到的URL,但我认为这不可能?

看看StormCrawler,它是一个分布式网络爬虫,有一个Elasticsearch模块。它是高度可定制的,并通过尊重robots.txt和默认情况下每个主机或域只有一个线程来加强礼貌。

最新更新