为何Storm-Crawler的status与index索引文档数差异巨大?
解决StormCrawler-ElasticSearch中Index索引条目远少于Status的问题
这种情况我之前调试StormCrawler+ES组合的时候也碰到过,核心原因是Status索引记录所有爬取过的链接元数据,但只有满足特定条件的页面才会进入Index索引,咱们一步步排查:
1. 先检查URL过滤规则
StormCrawler的StatusUpdaterBolt会记录所有爬取尝试的链接(不管能不能被索引),但IndexerBolt只会处理通过过滤规则的URL:
- 打开你的
crawler-conf.yaml,找到urlfilters.config.file对应的配置文件(通常是urlfilters.json),看看是不是设置了过于严格的正则表达式,只允许31条符合条件的URL进入索引流程。 - 也可以检查
robots.txt的限制,有些网站的robots规则会禁止爬取大部分页面,这时候Status会记录这些被拒绝的链接,但Index不会收录。
2. 验证Indexer的触发条件
确认IndexerBolt的配置是否只针对特定状态的页面:
- 查看
crawler-conf.yaml里的indexer.filter.status配置,默认值是只索引fetched状态(也就是爬取成功、返回200状态码)的页面。如果你的爬虫里大部分页面返回了非200状态(比如404、302),这些会被Status记录,但不会进入Index。 - 可以查看Storm的日志,搜索
IndexerBolt关键词,看看有没有类似Skipping document: no valid content found的提示——如果页面内容为空或者提取不到有效字段,Indexer会跳过索引。
3. 检查拓扑的组件链路
确保你的爬虫拓扑里,FetcherBolt之后正确连接了ParserBolt和IndexerBolt:
- 用
storm list查看拓扑的运行状态,再通过storm ui查看每个Bolt的处理统计——如果IndexerBolt的execute count只有31,说明上游确实只传过来31条符合条件的页面;如果execute count远大于31但Index索引里只有31条,那就是ES写入环节出了问题。
4. 排查ElasticSearch的索引配置
有时候Index索引的映射或设置会导致文档无法写入:
- 在Kibana Dev Tools里执行
GET index/_mapping,检查字段映射是否和爬虫输出的字段匹配(比如不要把需要存储文本的字段设成keyword类型)。 - 确认Index索引的自动创建功能是否开启,有没有设置写入权限限制。
按照这个流程排查,应该能快速定位到问题,让Index索引收录所有你需要的页面~
内容的提问来源于stack exchange,提问作者bob9123
相关产品推荐
相关产品推荐

