使用metadata.transfer和N:M关系抓取小主页

时间:2017-05-22 10:47:45

标签: elasticsearch web-crawler stormcrawler

大家好,

我们使用带有elasticsearch的StormCrawler来制作我们主页的索引,该索引包含"旧页面"和"新页面"。 我的问题简而言之: 如果两个页面A(旧),B(新)链接到页面X,如何将元数据从B传递到X?

我的问题: 我们一步一步地重新启动了我们的主页。因此,我们有时可以通过旧的html页面,只通过新的html页面或两种方式访问​​pdf文件。

对于"按顺序排列"目的我们必须标记新的html页面可以访问的所有pdf文件。 所以我们插入" newHomepage = true"到seeds.txt和" metadata.transfer / -newHomepage" to" crawler-conf.yaml":很好: - )

但是对于可以从旧版本访问的pdf文件!新的html页面,我们现在有一个竞争条件:如果我们的pdf文件是" DISCOVERED"从旧页面,此信息(newHomepage = false)位于状态索引中,无法覆盖。 (StatusUpdaterBolt不会覆盖文档,IndexerBolt默认会覆盖)。

使思考更加复杂:在我们的例子中,在文件传递之前,PDF的URL(在html页面上)被重定向两次。

因此,从我的观点来看,我们有两种可能性:

  1. 启动爬虫两次。首先,我们只索引新页面(以及所有可访问的pdf文件),然后我们将旧页面编入索引。
    • - >在抓取工具启动后更改的新网页出现问题
  2. 商店" outbound_links"并用它们来设置" newHomepage"独立于爬虫
    • - >索引
    • 中的元数据错误的短时间
  3. 有任何建议或其他想法吗?

    祝你好运   卡斯滕

1 个答案:

答案 0 :(得分:1)

感谢您分享您的问题,并且非常高兴听到您正在使用SC。这是一个有趣且不寻常的用例。

您对问题的分析是正确的。一种直观的方法是扩展默认的StatusUpdaterBolt,以便在文档已经存在时更新元数据。您需要删除检查文档是否具有DISCOVERED状态的部分。

这会降低速度,但由于您正在处理单个网站,因此不应产生重大影响。

如果文档已经被提取,那么你可以通过设置一个新的nextFetchDate进一步推动逻辑,以便在doc索引中更快地重新获取和更新(而不是状态一)。