如何动态更改StormCrawler的开始,跟随和不跟随网址

时间:2017-08-08 09:12:47

标签: web-crawler apache-storm stormcrawler

我是StormCrawler的新手,我第一次实现了网络爬虫,到目前为止我对该产品非常满意!

我正在使用StormCrawler v1.5.1和Elastic 5.5.1,并根据提供的" ESCrawlTopology.java"设置我的拓扑。

我希望能够在拓扑运行时更改起始URL(种子)和follow- / no-follow-URL。到目前为止我得到的是一个redis-DB,它拥有这个配置和一个URL-Filter,它使用redis来读取其后续跟随模式。 我还实现了一个start-url spout,它从redis中读取,检测更改并通过status-updater将新发现的start-urls发布为弹性。 到目前为止,这种设置效果很好。

对于跟随/不遵循规则,我还实施了一个检测更改的spout,并从" index" - 和" status" -Index中删除所有不再匹配的URL在弹性中使用" DeleteByQuery" -Elastic-action。我没有使用Status-Updater或DeletionBolt。

即使这样有效,但感觉不对,我确实看到了潜在的问题。首先,我无法使用状态更新程序的缓存,因为删除不是通过此组件完成的,因此缓存不会更新,从而阻止状态更新程序添加曾经添加,删除和再次添加的URL。其次,当一个或多个URL被排除或解析时,它们被排除并从" status"中删除。和"索引"我不确定结果。我希望正在处理的URL尽管被排除在外,但仍会被编入索引。

我还尝试了一个设置,我将所有排除的URL发送到状态更新程序,并显示ERROR状态。与DeletionBolt结合使用会导致URL从" index" -index中取出。这似乎是一个更清洁的解决方案 - 但是被排除在外的URL永远不会再被重新编入索引,因为它们位于"状态" -index为" ERROR"。

我眼中最好的解决方案是:

  1. 使用状态" REMOVED"在" status" -index中标记排除的网址(暂时不可用)
  2. 让所有组件(fetcher,parser ...)都知道" REMOVED"放弃当前正在处理的已排除网址的状态
  3. 实施一个清理过程,该过程发送所有" REMOVED" DeletionBolt的URL也会从" status"中删除此URL。在acking
  4. 目前我没有看到实现这一点的方法,如果没有对StormCrawler的核心组件进行重大调整,因为目前没有这样的状态和#34; REMOVED"。

    您对此问题的看法是什么?可能的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

正如您所指出的那样,添加新的REMOVED状态并不一定非常简单。

不是删除ES中的URL,而是将自定义布尔字段添加到搜索索引中,例如活动,默认值为true,这样如果以后添加内容,您只需切换索引中的值即可。很明显,您必须扫描该索引才能更改值,但这可以在SC之外完成。

从状态索引的角度来看,即使它们被停用,事情也会保留,只是你有一个实时的URL过滤器+可能扩展ES索引代码,以便它经常检查模式并为活动字段生成正确的值。

这有意义吗?

相关问题