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