web-crawler - 使 StormCrawler 能够爬取具有多个 spout 的单个域
问题描述
我正在使用 StormCrawler 和 Elasticsearch 进行概念验证,以仅抓取一个域,几个主机 - 一个包含许多页面。有没有办法告诉stormcrawler不要将主机或域的所有url分组在一个spout中?
我按照 Youtube 教程进行设置,并将 spout 设置为 10 个并行度,但据我所知,风暴 UI 仅使用 1 个。如何让它传播单个域的 url,甚至一个主机覆盖所有的 spout?
谢谢!吉姆
解决方案
要对每个主机的 URL 进行分区,您的配置应该有partition.url.mode: "byHost"这是默认值。这会将属于不同主机的 URL 放入不同的分片中,并且将使用更多的 spout 实例。
来自同一主机的 URL 被放在相同的分片中以强制执行礼貌。如果您想从主机并行获取,您可以简单地将fetcher.threads.per.queue设置为您想要的任何值。如果该网站是您自己的,这是可以接受的,但如果它属于其他人,则显然是不礼貌的。即使您继续对每个主机进行分片,这也可以正常工作。
当然,您可以通过将es.status.routing设置为 false 来完全禁用路由。无论主机名如何,ES 都会对 URL 进行分片,并且将使用所有分片和 spout。然而,这意味着对礼貌没有严格的控制。