【发布时间】:2018-12-30 16:59:48
【问题描述】:
我正在运行一个与网络爬虫配合使用的利基搜索产品。当前的爬虫是一个单独的(PHP Laravel)工作者爬取网址并将结果放入弹性搜索引擎。系统会以X毫秒的间隔不断地重新抓取找到的url。
这对我很有帮助,但是随着一些新的大客户的出现,爬虫将达到它的极限。我需要将系统重新设计为分布式爬虫,以加快爬取速度。问题在于以下规格的组合。
系统必须遵守以下两条规则:
- 多个工作人员(并发问题)
- 每个客户端的可变速率限制。我需要非常确定系统不会每 X 毫秒抓取一次客户端 X。
我尝试过的:
我尝试将 url 放入 MySQL 表中,并让工作人员根据客户端和 urls 表中的 last_crawled_at 时间戳查询要抓取的 url。但是 MySQL 不喜欢多个并发工作人员,我会收到各种死锁。
我尝试将 url 放入 Redis 引擎。我得到了这种工作,但只有一个 Lua 脚本检查并为每个正在服务的客户端设置一个过期密钥。这一切都让人觉得有点骇人听闻。
我曾考虑填充一个常规队列,但这将违反规则 2,因为我不能 100% 确定工作人员可以“实时”处理队列。
谁能解释一下大男孩是怎么做到的?我们如何让多个进程根据一些标准(例如限制客户端的速率)查询大/大量的 url 列表,并确保我们只将 url 分发给 1 个工作人员?
理想情况下,除了 Elastic 之外,我们不需要其他包含所有可用/找到的 url 的数据库,但我认为这不可能?
【问题讨论】:
-
您还愿意讨论吗?问题是没有一个解决方案可以解决这个问题,因为分布式爬虫有很多风格,我花了数年时间阅读,但现在我正在构建一个用于生产。如果您愿意讨论分布式爬虫,请告诉我,请在此处投递您的电报
标签: elasticsearch redis web-crawler rate-limiting flow-control