`

nutch 0.9二次开发--搜索结果优化

阅读更多

使用nutch 0.9自带的程序包搜索的时候,存在一个冗余数据的情况。例如,如果想搜索关于姚明、易建联等的信息时,nutch默认会把网页中导航条或者一些标题等中包含姚明和易建联信息的页面检索出来,以腾讯为例,http://sports.qq.com/nba/的导航条部分包含了姚明和易建联。

但这个页面的其他信息没有设计到姚明和易建联,所以这个页面可能实际上不是我们想要的;

还有一种情况,当我们想搜索“莎娃”的时,nutch会抓取到http://sports.qq.com/a/20090108/000407.htm,但实际上“莎娃”只是在这个页面的右边超链接款上有包含“莎娃”的信息。

如下图:

这个页面也可能不是我们想要的。

深入研究nutch工作原理:

 

结论:nutch通过HTMLParser把爬取到的网页解析成文本格式,保存到本地硬盘,然后再通过lucene建立索引,如果想达到去除无用信息目的,就要从图中红色标注的部分入手。

优化搜索结果方法1:

改写org.apache.nutch.parse.html.DOMContentUtils文件,修改方法getTextHelper方法:

getTextHelper源代码:

private boolean getTextHelper(StringBuffer sb, Node node,
                                             boolean abortOnNestedAnchors,
                                             int anchorDepth) {
    if ("script".equalsIgnoreCase(node.getNodeName())) {
      return false;
    }
    if ("style".equalsIgnoreCase(node.getNodeName())) {
      return false;
    }
    if (abortOnNestedAnchors && "a".equalsIgnoreCase(node.getNodeName())) {
      anchorDepth++;
      if (anchorDepth > 1)
        return true;
    }
    if (node.getNodeType() == Node.COMMENT_NODE) {
      return false;
    }
    if (node.getNodeType() == Node.TEXT_NODE) {
      // cleanup and trim the value
      String text = node.getNodeValue();
      text = text.replaceAll("\\s+", " ");
      text = text.trim();
      if (text.length() > 0) {
        if (sb.length() > 0) sb.append(' ');
      sb.append(text);
      }
    }
    boolean abort = false;
    NodeList children = node.getChildNodes();
    if (children != null) {
      int len = children.getLength();
      for (int i = 0; i < len; i++) {
        if (getTextHelper(sb, children.item(i),
                          abortOnNestedAnchors, anchorDepth)) {
          abort = true;
          break;
        }
      }
    }
    return abort;
}

 

自定义方法(实际上就是过滤掉解析下来包含<a href=" ">的信息):

private boolean getTextHelper(StringBuffer sb, Node node,
                                             boolean abortOnNestedAnchors,
                                             int anchorDepth) {
    if ("script".equalsIgnoreCase(node.getNodeName())) {
      return false;
    }
    if ("style".equalsIgnoreCase(node.getNodeName())) {
      return false;
    }
    if (abortOnNestedAnchors && "a".equalsIgnoreCase(node.getNodeName())) {
      anchorDepth++;
      if (anchorDepth > 1)
        return true;
    }
    if (node.getNodeType() == Node.COMMENT_NODE) {
      return false;
    }

    if (node.getNodeType() == Node.TEXT_NODE) { //node是解析下来的网页源文件所包含的内容

                           //Node.TEXT_NODE:节点属于文本节点<body><div><a href><td>等标签
      // cleanup and trim the value
      String text = node.getNodeValue();         //获取节点里面的文本内容,相当与去掉HTML标签

       /* 过滤掉包含的特殊字符*/
      text = text.replaceAll("\\s+", " ");
      text = text.replace("【", "");
      text = text.replace("】", "");
      text = text.replace("[", "");
      text = text.replace("]", "");
      text = text.replace("|", "");
      text = text.replace("┊", "");
      text = text.replace("?", "");
      text = text.replace("?", "");
      text = text.replace("?", "");
      text = text.replace("|", "");
      text = text.replace("、", "");
      text = text.replace("-", "");
      text = text.replace("~", "");
      text = text.replace("!", "");
      text = text.replace("@", "");
      text = text.replace("#", "");
      text = text.replace("$", "");
      text = text.replace("^", "");
      text = text.replace("*", "");
      text = text.replace("(", "");
      text = text.replace(")", "");
      text = text.replace("%", "");
      text = text.replace(">", "");
      text = text.replace("?", "");
      text = text.replace("%", "");

      text = text.trim();

     temp = node.getParentNode().toString();                         //获取父节点的标签

      if (text.length() > 0 && temp.indexOf("A:") == -1) {         //如果属于<a href>,则过滤...

        if (sb.length() > 0) sb.append(' ');
      sb.append(text);
      }
    }
    boolean abort = false;
    NodeList children = node.getChildNodes();
    if (children != null) {
      int len = children.getLength();
      for (int i = 0; i < len; i++) {
        if (getTextHelper(sb, children.item(i),
                          abortOnNestedAnchors, anchorDepth)) {
          abort = true;
          break;
        }
      }
    }
    return abort;
}

相关资料:接口org.w3c.dom.Node的使用:http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/org/w3c/dom/class-use/Node.html

分享到:
评论

相关推荐

    nutch 0.9 版(包含war,bin,src可直接部署使用)

    Nutch 0.9 版本发布于较早时期,但其核心原理和技术至今仍然对理解搜索引擎的工作机制具有重要意义。 2. **WAR 文件**: 提供的WAR(Web Application Archive)文件是Java Web 应用的标准打包格式,可以直接部署在...

    Eclipse中编译Nutch-0.9

    ### Eclipse中编译Nutch-0.9:详解与步骤 #### 核心知识点概览 在本篇文章中,我们将深入探讨如何在Eclipse环境中编译Nutch-0.9,一个开源的网络爬虫项目,用于抓取互联网上的网页信息。文章涵盖的关键知识点包括...

    nutch09版本亲测好用

    Nutch 0.9 是一个历史悠久的开源搜索引擎项目,它主要关注网络爬虫和网页抓取方面的技术。这个版本在当时提供了稳定且功能强大的爬虫框架,被广泛用于数据采集和分析任务。以下是对 Nutch 0.9 版本的一些关键知识点...

    Nutch1.7二次开发培训讲义

    ### Nutch 1.7 二次开发培训讲义知识点概览 #### 一、环境搭建与准备工作 **1. 开发环境的选择与配置** - **操作系统:** 二次开发Nutch 1.7时,开发阶段的操作系统选择相对灵活,只要确保安装了JDK和Eclipse即可。...

    nutch 0.9分页代码(粘贴可用)

    ### Nutch 0.9 分页代码解析与应用 #### 一、背景介绍 Nutch 是一个开源的网络爬虫项目,它提供了高度可扩展且可靠的网页抓取框架。随着互联网的发展,数据量日益增大,如何高效地处理这些数据成为了一个重要的...

    nutch-0.9 环境搭建所需最小cygwin

    《nutch-0.9 环境搭建所需最小cygwin详解》 在构建一个功能完备的搜索引擎系统时,Apache Nutch是...尽管这需要一定的技术背景,但只要遵循上述步骤并耐心处理可能出现的问题,你就能成功构建起自己的Nutch搜索引擎。

    eclipse配置nutch,eclipse配置nutch

    ### 二、Eclipse配置Nutch的步骤详解 #### 步骤1:创建Nutch项目 首先,在Eclipse中创建一个新的Java项目,选择“File &gt; New &gt; Project &gt; Java project”,然后点击“Next”。在创建项目时,选择“Create project ...

    lucene+nutch搜索引擎(1-11章源码)

    《深入剖析Lucene+Nutch搜索引擎》 在信息技术领域,搜索引擎是不可或缺的一部分,它极大地提高了我们获取网络信息的效率。Lucene和Nutch是两个在开源社区中广泛使用的搜索引擎技术,它们各自扮演着重要的角色。本...

    Nutch搜索引擎(1-5期)

    Nutch搜索引擎·Nutch简介及安装(第1期) Nutch搜索引擎·Solr简介及安装(第2期) Nutch搜索引擎·Nutch简单应用(第3期) Nutch搜索引擎·Eclipse开发配置(第4期) Nutch搜索引擎·Nutch浅入分析(第5期)

    nutch二次开发学习笔记

    我们需要去抓取网页数据的时候我们就用nutch来爬取,我们对它进行二次开发使其更加符合我们的需求

    rtf-parse.jar、jid3lib-0.5.4.jar

    `Nutch`是Apache软件基金会的一个开源项目,主要用于网络爬虫和搜索引擎的开发。它采用Java编写,提供了一个可扩展的、分布式的Web抓取框架。在编译`Nutch`项目时,可能需要依赖各种`jar`库,包括`rtf-parse.jar`和`...

    Nutch1.7二次开发培训讲义 之 腾讯微博抓取分析

    ### Nutch 1.7 二次开发培训讲义之腾讯微博抓取分析 #### 一、概述 Nutch 是一个开源的网络爬虫项目,它提供了灵活的数据抓取能力,并支持二次开发定制功能。本篇培训讲义主要针对的是如何使用 Nutch 1.7 版本对...

    apache-nutch-2.3.1-src.tar.gz

    Apache Nutch 是一个开源的网络爬虫项目,用于抓取互联网上的网页并建立索引,以便于搜索引擎进行高效检索。Nutch 是由 Apache Software Foundation 维护,它提供了完整的网络爬虫解决方案,包括数据采集、预处理、...

    windows下nutch的安装.pdf

    安装完上述依赖后,将Nutch的源代码包下载到本地,解压至指定目录,如C:\nutch-0.9。解压后,需要修改nutch-site.xml文件以配置Nutch运行时的相关参数,例如配置抓取的用户代理名称: ```xml &lt;name&gt;...

    实验报告(利用Nutch和IKanalyzer构造中文分词搜索引擎)

    通过执行bin/nutch crawl命令,可以开始网页抓取,并在nutch-0.9目录下生成crawl文件夹存储结果。 然后,测试Nutch自带的搜索引擎。将nutch-0.9-war部署到Tomcat服务器上,并对nutch-site.xml进行配置。在运行过程...

    apache-nutch-1.6-bin.tar.gz最新版

    在e盘下面出现nutch-0.9文件夹说明解压成功了.然后环境变量设置为NUTCH_JAVA_HOME=C:\Program Files\Java\jdk1.5.0(也就是说跟JAVA_HOME是相同的).测试nutch是否安装成功,只需要执行以下命令: $cd D:/Downloads/...

    开发基于 Nutch 的集群式搜索引擎

    Nutch搜索引擎的核心功能包括网页抓取、内容解析、索引建立以及查询服务。其中,网页抓取(或称爬虫)模块负责从网络上抓取网页内容;内容解析模块用于提取网页中的文本信息;索引建立模块则将解析后的数据组织成...

    nutch-craw-jobs-plugin

    Nutch 是一个开源的全文搜索引擎框架,主要用于网络爬虫的构建。它由 Apache 软件基金会开发,设计用于高效、可扩展的网络抓取和索引。在Nutch的生态系统中,插件机制是其核心特性之一,允许开发者根据需求定制特定...

    nutch+lucene开发自己的搜索引擎ch3.pdf

    ### nutch+lucene开发自己的搜索引擎知识点总结 #### 一、概览 - **标题与描述**: 本资料“nutch+lucene开发自己的搜索引擎ch3.pdf”聚焦于介绍如何使用Nutch和Lucene来构建自己的搜索引擎,特别强调了第三章:...

Global site tag (gtag.js) - Google Analytics