Web crawler 基于RSS提要中的pubDate/lastBuildDate重新抓取页面

Web crawler 基于RSS提要中的pubDate/lastBuildDate重新抓取页面,web-crawler,stormcrawler,Web Crawler,Stormcrawler,我正在建立一个基于Stormcrawler(v1.13)和Elasticsearch的websearch。我已经配置了Stormcrawler,每24小时重新爬网索引页。此外,该网站有一个RSS提要,其中包含最近发布或更新的页面,每10分钟进行一次爬网。这对于检测新页面非常有效。然而,我也希望在短时间内重新抓取已更改的页面(例如,当标题更改时) 解析RSS源时,发现的URL将发送到调度程序,状态为discovered,并从RSS源发送一些额外的元数据(即feed.publishedDate) 我

我正在建立一个基于Stormcrawler(v1.13)和Elasticsearch的websearch。我已经配置了Stormcrawler,每24小时重新爬网索引页。此外,该网站有一个RSS提要,其中包含最近发布或更新的页面,每10分钟进行一次爬网。这对于检测新页面非常有效。然而,我也希望在短时间内重新抓取已更改的页面(例如,当标题更改时)

解析RSS源时,发现的URL将发送到调度程序,状态为
discovered
,并从RSS源发送一些额外的元数据(即
feed.publishedDate

我最初的想法是,每当文档被标记为已获取时(使用自定义索引器),就向
状态
索引添加元数据
索引数据。这将是页面上一次索引的时间戳。然后,我将实现一个自定义调度程序,它检查
feed.publishedDate
(来自RSS提要中发现的
条目)是否比已存储在
状态
索引中的相应条目的
索引数据更新。如果是这样,它会将下一个获取日期设置为当前时间,以便尽快重新获取

问题是我找不到一个好方法来访问索引页面和发现的RSS条目,所以我可以比较日期。有没有其他的推荐方式可以满足我的需求

下面是我的
crawler.flux
-文件中的一些代码:

...

bolts:

...

  - id: "feed"
    className: "com.digitalpebble.stormcrawler.bolt.FeedParserBolt"
    parallelism: 1

...

streams:
  - from: "spout"
    to: "partitioner"
    grouping:
      type: SHUFFLE

  - from: "spout"
    to: "status_metrics"
    grouping:
      type: SHUFFLE     

  - from: "partitioner"
    to: "fetcher"
    grouping:
      type: FIELDS
      args: ["key"]

  - from: "fetcher"
    to: "sitemap"
    grouping:
      type: LOCAL_OR_SHUFFLE

  - from: "sitemap"
    to: "feed"
    grouping:
      type: LOCAL_OR_SHUFFLE

  - from: "feed"
    to: "parse"
    grouping:
      type: LOCAL_OR_SHUFFLE

  - from: "parse"
    to: "index"
    grouping:
      type: LOCAL_OR_SHUFFLE
...


这是一个很好的问题,谢谢你的提问

如果有一个自定义URL过滤器来检查一个URL的索引日期是否已经小于发布日期,如果是,则将其状态更改为“已获取”呢?这样,文档将覆盖ES中的现有文档,并且不会被状态更新程序中的缓存丢弃

您可以在元数据中给它scheduler.delay.mins=0,以便调度器将其值设置为now

缺点是您可能需要将查询批处理到ES,这将引入一些延迟

另一种方法是编写自己的状态更新程序bolt,而不使用任何缓存,并写入ES,以便在必要时修改下一个获取日期。这可能需要一个脚本


你觉得怎么样?

非常感谢你的意见,朱利安!关于您的第一个建议:URL过滤器会为RSS提要中找到的每个URL运行,但我只能从提要本身(通过
sourceMetadata
)访问元数据,而不能访问
feed.publishedDate
所在的每个RSS条目(由
FeedParserBolt
提取)的元数据。还是我误解了什么?我想第二种方法可能会起作用,尽管禁用缓存感觉有点糟糕:/你完全正确,很抱歉造成混淆。您可以通过在状态更新程序bolt之前的状态流上添加自定义bolt来实现它。