使用 Storm 爬虫对每个域(例如速度)进行不同设置的域特定爬行

Domain-specific crawling with different settings for each domain (e.g. speed) using Storm crawler

我最近才发现 Storm 爬虫,根据过去的经验和研究以及使用不同的爬虫,我发现这个基于 Apache Storm 的项目非常健壮,适用于许多用例和场景。

我已经阅读了一些教程并使用一些基本设置测试了风暴爬虫。我想在我的项目中使用爬虫,但有些事情我不确定爬虫是否有能力做,或者即使它是否适合这样的用例。

我想在许多具有特定速度设置的 Web 域上进行小型和大型递归爬网,并限制获取的 URL 数量。可以随时使用不同的设置单独启动爬网(不同的速度,忽略该域的 robots.txt,忽略外部链接)。

问题:

我认为对于其中一些问题,答案可能是自定义或编写我自己的螺栓或喷口。但我宁愿避免修改 Fetcher Bolt 或爬虫的主要逻辑,因为那意味着我正在开发另一个爬虫。

谢谢。

你的问题很有趣。我想你可以在这里发现更多: 代码:https://github.com/DigitalPebble/storm-crawler oficial tutorial: http://stormcrawler.net/ and some responces: http://2015.berlinbuzzwords.de/sites/2015.berlinbuzzwords.de/files/media/documents/julien_nioche-low_latency_scalable_web_crawling_on_apache_storm.pdf

很高兴你喜欢 StormCrawler

  • 风暴爬虫是否适合table这种场景?

可能,但您需要 modify/customise 一些事情。

  • 我可以设置爬虫最大抓取页数的限制吗?

您目前可以设置种子的深度限制,并且每个种子具有不同的值。

没有根据 URL 的数量进行全局过滤的机制,但可以做到这一点。这取决于您使用什么来存储 URL 状态以及相应的 spout 和状态更新器实现。例如,如果您使用 Elasticsearch 存储 URLs,您可以让 URL 过滤器检查索引中 URLs 的数量并过滤 URLs(是否存在)基于此。

  • 我可以设置不同域的抓取页面数量限制吗?

您可以将上面提出的解决方案专门化,并针对每个域或主机查询已知的 URL 数量。这样做不需要对核心元素进行任何修改,只需一个自定义 URL 过滤器。

  • 我可以单独监控特定域的抓取进度吗?

同样,这取决于您使用什么作为后端。以 Elasticsearch 为例,您可以使用 Kibana 查看每个域的 URLs。

  • 我可以动态设置设置而不需要将修改后的拓扑上传到 storm 吗?

没有。工作任务启动时读取配置。我知道一些用户编写了一个由 DB table 支持的自定义配置实现,并让他们的组件从中读取,但这意味着修改大量代码。

  • 是否可以暂停或停止抓取(针对特定域)?

不是基于每个域,但您可以添加一个中间螺栓来检查是否应处理某个域。如果不是,您可以简单地使 ack 失败。这又取决于状态存储。例如,您还可以向 ES 喷口添加自定义过滤器,并在状态索引中添加一个字段。每当应该停​​止对特定域的爬网时,您可以例如修改与特定域匹配的所有 URL 字段的值。

  • 风暴爬虫运行通常是作为一个部署拓扑吗?

是的,经常。

  • 我认为对于其中一些问题,答案可能是自定义或编写我自己的螺栓或喷口。但我宁愿避免修改 Fetcher Bolt 或爬虫的主要逻辑,因为那意味着我正在开发另一个爬虫。

StormCrawler 是非常模块化的,所以总是有几种做事的方法;-)

我很确定您可以通过修改小的非核心部分来获得您想要的行为,同时具有单个拓扑。如果需要代码的更多重要部分(例如每个种子机器人设置),那么我们可能希望将其添加到代码中 - 非常欢迎您的贡献。