我是相当新的stormcrawler,做我的第一个实现一个网络爬虫,我很高兴与产品到目前为止!
我正在使用StormCrawlerv1.5.1和Elastic5.5.1,并根据提供的“escrawltopology.java”设置拓扑。
我想能够改变开始网址(种子)和跟随/不跟随网址,而拓扑正在运行。到目前为止,我得到的是一个redis数据库,它保存了这个配置,还有一个url过滤器,它使用redis从数据库读取follow-no-follow模式。我还实现了一个starturlspout,它从redis读取、检测更改并通过状态更新程序将新找到的starturls发布到elastic。到目前为止,这个设置工作得很好。
对于follow-/no follow规则,我还实现了一个spout,它使用deletebyquery-elastic操作检测更改并从elastic中的“index”和“status”索引中删除所有不再匹配的url。我没有为此使用状态更新程序或deletionbolt。
尽管这样做有效,但感觉不对,我确实看到了潜在的问题。首先,我不能使用状态更新程序的缓存,因为删除不是通过这个组件完成的,因此缓存不会得到更新,从而阻止状态更新程序添加曾经添加、删除和再次添加的url。第二,当一个或多个url被提取或解析时,它们被排除在“状态”和“索引”之外,我不确定结果。我希望在过程中的网址被索引,尽管他们被排除之前。
我还尝试了一个设置,将所有排除的url发送到状态更新程序,并显示错误状态。结合deletionbolt,这将导致url从“index”索引中删除。这似乎是一个更干净的解决方案-然而,网址被排除一次,永远不能再重新索引,因为他们驻留在“状态”-作为“错误”索引。
在我看来,最好的解决办法是:
使用状态“removed”(目前不可用)在“status”索引中标记排除的URL
使所有组件(fetcher、parser…)都知道“removed”状态,以丢弃当前正在处理的排除的url
实现一个清理过程,将所有“已删除”的url发送到deletionbolt,并在确认时将此url从“状态”中删除
目前,我看不到一种方法来实现这一点,没有重大调整的核心组件的stormcrawler,因为目前没有这样的状态,如“删除”。
你对这个问题有什么看法?有什么可能的解决办法?
1条答案
按热度按时间7vux5j2d1#
正如您所指出的,添加一个新的removed状态不一定非常简单。
与其删除es中的url,不如在搜索索引中添加一个自定义布尔字段(例如,使用默认值true的active),这样,如果以后再添加一些内容,您所要做的就是切换索引中的值。显然,您必须扫描该索引才能更改值,但这将在sc之外完成。
从状态索引的Angular 来看,即使停用了,也会保留一些内容,只是您有一个实时url筛选器+可能会扩展es索引代码,以便它每隔一段时间检查一次模式,并为活动字段生成正确的值。
这有道理吗?