zoukankan      html  css  js  c++  java
  • Nutch 使用总结

    Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。

     Nutch使用方法简介: http://blog.csdn.net/pengpengfly/archive/2008/09/29/2994664.aspx

    nutch1.2 eclipse tomcat6.0 配置 :http://hi.baidu.com/oliverwinner/blog/item/4be3f1370284b32f5ab5f565.html

    Nutch 实战:介绍了开源搜索引擎 Nutch 的基本信息,详细说明了在 Eclispe 下运行 Nutch 的步骤和需要注意的问题,还分析了部分源代码。很好的文章


    Nutch 目录结构

    bin:用于命令行运行的文件;

    conf:Nutch的配置文件

    lib:一些运行所需要的jar文件;

    plugins:存放相应的插件;

    src:Nutch的所有源文件;

    webapps:web运行相关文件;

    nutch-0.9.war是 Nutch所提供的基于Tomcat的应用程序包。

    Nutch工作流程

    1. 将起始 URL 集合注入到 Nutch 系统之中。

    2. 生成片段文件,其中包含了将要抓取的 URL 地址。

    3. 根据URL地址在互联网上抓取相应的内容。

    4. 解析所抓取到的网页,并分析其中的文本和数据。

    5. 根据新抓取的网页中的URL集合来更新起始URL集合,并再次进行抓取。

    6. 同时,对抓取到的网页内容建立索引,生成索引文件存放在系统之中。

    (1)准备需要的软件列表
            Cygwin     (下载地址:http://www.cygwin.com/setup.exe)
            Jdk(1.4.2以上版本,下载地址http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u29-download-513648.html)
            Nutch(推荐使用0.9版本,下载地址http://www.apache.org/dyn/closer.cgi/lucene/nutch/)
            Tomcat(下载地址http://tomcat.apache.org/)

    (2)安装软件
         1)  Cygwin 打开安装程序Cygwin.exe后,在"Choose Installation Type"页选择 "Install from Internet"(如果你已经把全部安装包下载到本地,就可以选择"Install from local directory"选项)。然后点击"Next".
              然后选择安装目录,其他可保持默认选项,点击"Next".
              选择保存安装包的本地目录,点击"Next".
              选择下载连接的类型,点击Next。
              然后通过服务器先下在需要安装的包列表,改为install比较合适,默认为default安装不全
              完成安装。

              图文讲解
         2) 安装JDK ,注意安装完成后需要在Windows的环境变量中加入JAVA_HOME=你的jdk的安装目录
         3) 安装Tomcat,下载安装版。

         4)把Nutch解压到本地目录,例如D:/nutch。启动Cygwin程序,Cygwin程序会启动一个模拟Unix/Linux的终端窗口,然后使 用方式就和Unix的Shell一样了,Cygwin的根目录是/cygdriver,这个目录相当于Windows的“我的电脑”,然后进入Nutch 的目录,例如:cd /cygdriver/d/nutch,然后运行bin/nutch命令,如果出现下面的Usage 信息,这样Nutch就安装完成了,非常简单。

         注意cygwin路径的切换方法:

         命令:cd d:/nutch

    (3)使用Nutch

    Nutch  的爬虫有两种方式
    •  爬行企业内部网(Intranet crawling)。针对少数网站进行,用 crawl 命令。  
    •  爬行整个互联网。  使用低层的 inject, generate, fetch 和 updatedb 命令,具有更强的可控制性。 

          1) 添加需要爬行的内部网地址信息。
             新建一个目录,写入一些网址信息,例如我们需要爬行csdn的内部网。
                 mkdir urls
                 echo http://www.csdn.net/ >urls/csdn    后面有斜线
         2) 然后修改 conf目录下的crawl-urlfilter.txt文件,这个文件中的正则表达式定义了那些文件可以被Nutch爬行,那些不可以被爬行。其中以“+”号开头的表示属于Nuch合法的Url连接,“-”号开头相反。我们需要修改文件中的
              # accept hosts in MY.DOMAIN.NAME
               +^http://([a-z0-9]*/.)*MY.DOMAIN.NAME/
             为
            # accept hosts in MY.DOMAIN.NAME
            +^http://([a-z0-9]*/.)*csdn.net/    

    # accept hosts in MY.DOMAIN.NAME

    +^http://([a-z0-9]*\.)*
          3)接下来我们需要配置conf/nutch-site.xml,这个需要填写相关的代理属性,应为Nutch也许要准受Robot协议,在爬行人家网站的时候,把相关的信息提交给被爬行的网站。
             我们在这个文件中,需要在<configuration>和</configuration>之间,加入是个代理属性,例如http.agent.name属性      
             <property>
             <name>http.agent.name</name>
             <value>nutch-1.2</value>
             <description>csdn.com</description>
             </property>
            其中除了name字段需要准确添写外,其他value和descrption字段可或添写。同样,还需要加入http.agent.description,http.agent.url和http.agent.email这三个属性。例如

    1. <?xml version="1.0"?>  
    2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
    3. <!-- Put site-specific property overrides in this file. -->  
    4. <configuration>  
    5. <property>  
    6.   <name>http.agent.name</name>  
    7.   <value>nutch-1.2</value>  
    8.   <description>tjt</description>  
    9. </property>  
    10. <property>  
    11.   <name>http.robots.403.allow</name>  
    12.   <value>true</value>  
    13.   <description></description>  
    14. </property>  
    15. <property>  
    16.   <name>http.agent.description</name>  
    17.   <value>tjtnutchhoho</value>  
    18.   <description></description>  
    19. </property>  
    20. <property>  
    21.   <name>http.agent.url</name>  
    22.   <value>http://ucooper.com</value>  
    23.   <description></description>  
    24. </property>  
    25. <property>  
    26.   <name>http.agent.email</name>  
    27.   <value>tangjiutao@gmail.com</value>  
    28.   <description></description>  
    29. </property>  
    30. <property>  
    31.   <name>http.agent.version</name>  
    32.   <value>Nutch-1.2</value>  
    33.   <description></description>  
    34. </property>  
    35. <!-- file properties -->  
    36. <property>  
    37. <name>searcher.dir</name>  
    38. <value>E:/nutch/csdn</value>  
    39. <description></description>  
    40. </property>  
    41. </configuration>  

    这里的设置,是因为nutch遵守了 robots协议,在获取 response时,把自己的相关信息提交给被爬行的网站,以供识别。
           4)这样就完成了全部爬行所需要的配置,下面就可以用nutch的crawl命令来派性企业内部网了
            再nutch目录中输入:
            bin/nutch crawl urls -dir csdn -threads 4 -depth 2 -topN 30
            这样nutch就启动并且开始爬行任务了,由于是简单示例,所以以上这个命令很快就结束了,因为爬行的广度和深度都非常小,也就是说,示例只爬行了csdn网站的很小一部分网页。
           下面就上面命令的参数进行说明:
            Crawl命令的使用说明为: crawl <url dir> [-dir index] [-threads num] [-depth num] [-topN num]
            其中:
               urls是存放需要爬行网址的文件夹目录。
               -dir选项是抓取的页面的存放目录。
               -threads选项是启动的最大线程数。
               -depth选项是能爬行的最大深度,也就是最多爬行到第几级的页面,也叫爬行深度。
               -topN选项是在每层深度上,所能爬行的最多页面数,也称爬行广度。     
            完成爬行后,会在-dir选项所指定的目录中保存网页信息和搜索需要的索引。 

    ********************************************************

    常见报错:

    (1)Exception in thread "main" java.io.IOException: Job failed!
            at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1252)
            at org.apache.nutch.crawl.Injector.inject(Injector.java:217)
            at org.apache.nutch.crawl.Crawl.main(Crawl.java:124)

    请检查nutch-default.xml的plugin.folders是否修改为./src/plugin,默认为plugins,修改后启动正常
    (2)org.apache.nutch.plugin.PluginRuntimeException: java.lang.ClassNotFoundException: org.apache.nutch.net.urlnormalizer.basic.BasicURLNormalizer


    ********************************************************

    PDF支持:

    默认情况下不支持对pdf文件的索引,要想对pdf文件也进行正确的索上,找到nutch-default.xml中的plugin.includes属性,添加上pdf,即为parse-(text|html|js|pdf)。

    Nutch的爬行结果目录

    爬行结果目录含有segment, linkdb, indexes, index, crawldb文件夹

    Nutch的数据文件
    crawldb: 爬行数据库,用来存储所要爬行的网址
    linkdb: 链接数据库,用来存储每个网址的链接地址,包括源地址和链接地址
    segments: 抓取的网址被作为一个单元,而一个segment就是一个单元。一个segment包括以下子目录:
             crawl_generate:包含所抓取的网址列表
            crawl_fetch:包含每个抓取页面的状态
            content:包含每个抓取页面的内容
            parse_text:包含每个抓取页面的解析文本
            parse_data:包含每个页面的外部链接和元数据
            crawl_parse:包含网址的外部链接地址,用于更新crawldb数据库
    indexes: 采用Lucene的格式建立索引集
    index:最终生成的目录

    WebDB内存储了两种实体的信息:page和link。Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需 要描述,WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数 目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之间的链接关系。WebDB构成了一个所抓 取网页的链接结构图,这个图中Page实体是图的结点,而Link实体则代表图的边。
      一次爬行中每次循环都会产生一个segment,每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索 引。Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist,然后Fetcher通过 fetchlist中的URLs抓取这些网页并索引,然后将其存入segment。Segment是有时限的,当这些网页被Crawler重新抓取后,先 前抓取产生的segment就作废了。在存储中。Segment文件夹是以产生时间命名的,方便我们删除作废的segments以节省存储空间。
      Index是Crawler抓取的所有网页的索引,它是通过对所有单个segment中的索引进行合并处理所得的。Nutch利用Lucene技术进 行索引,所以Lucene中对索引进行操作的接口对Nutch中的index同样有效。但是需要注意的是,Lucene中的segment和Nutch中 的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各个部分网页的内容和索引,最后通 过其生成的index跟这些segment已经毫无关系了。

    Nutch之Crawler工作流程

    在Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的。这些子操作Nutch都提供了子命令行可以单独进行调用。下面就是这些子操作的功能描述以及命令行,命令行在括号中。
    1) 建立初始 URL集
    2) 将 URL 集注入 crawldb数据库---inject
    3) 根据 crawldb数据库创建抓取列表---generate
    4) 执行抓取,获取网页信息---fetch
    5) 更新数据库,把获取到的页面信息存入数据库中---updatedb
    6) 重复进行 3~5的步骤,直到预先设定的抓取深度。---这个循环过程被称为“产生/抓取/更新”循环

    7)  根据sengments 的内容更新 linkdb数据库---invertlinks
    8)  建立索引---index

    9) 在索引中丢弃有重复内容的网页和重复的URLs (dedup).
    10) 将segments中的索引进行合并生成用于检索的最终index(merge).

    11)  用户通过用户接口进行查询操作
    12) 将用户查询转化为lucene 查询
    13) 返回结果
    其中,1~6属于爬虫部分;7~10 属于索引部分;11~13属于查询部分。

     在创建一个WebDB之后, “产生/抓取/更新”循环(步骤3-6)根据一些种子URLs开始启动。当这个循环彻底结束,Crawler根据抓取中生成的segments创建索引 (步骤7-10)。在进行重复URLs清除(步骤9)之前,每个segment的索引都是独立的(步骤8)。最终,各个独立的segment索引被合并为 一个最终的索引index(步骤10)。
      其中有一个细节问题,Dedup操作主要用于清除segment索引中的重复URLs,但是我们知道,在WebDB中是不允许重复的URL存在的,那 么为什么这里还要进行清除呢?原因在于抓取的更新。比方说一个月之前你抓取过这些网页,一个月后为了更新进行了重新抓取,那么旧的segment在没有删 除之前仍然起作用,这个时候就需要在新旧segment之间进行除重。

    Nutch本身的搜索测试:

    在 cygwin 中输入 ”bin/nutch org.apache.nutch.searcher.NutchBean csdn” ,即调用 NutchBean 的 main 方法搜索关键字 ”csdn” ,在 cygwin 可以看到搜索出: Total hits: 29 ( hits 相当于 JDBC 的 results )

    注意: 如果发现搜索结果始终为 0 ,则需要配置一下 nutch-1.2/conf 的 nutch-site.xml   试试添加下面这段:(注意之前的http.agent.name必须有,如果没有这个property,则搜索结果一直为0)

    1. <!-- file properties -->  
    2. <property>  
    3. <name>searcher.dir</name>  
    4. <value>E:/nutch/csdn</value>  
    5. <description></description>  
    6. </property>  

    使用Tomcat进行搜索测试  
    (1)将nutch目录的nutch-1.0.war复制到tomcat/webapps下,可以改名为nutch以简化目录名,不改也可以

    (2)启动tomcat,然后就在webapps下面自动生成了一个nutch的文件夹,

    (3)打开 nutch/WEB-INF/classes下的nutch-site.xml文件,改为以下内容

    1. <?xml version="1.0"?>  
    2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
    3. <configuration>  
    4. <property>  
    5. <name>searcher.dir</name>  
    6. <value>E:/nutch/csdn</value>  
    7. <description></description>  
    8. </property>  
    9. </configuration>  


     (4) 启动Tomcat,打开浏览器在地址栏中输入:http://localhost:8080/nutch ,就可以看到搜索页面了.

    注意:从网页上复制的代码可能存在一些非英文编码字符,会造成影响,我就遇到了这个问题。把前面的空格等都去掉就解决了。

    nutch抓取下来,但搜索不到结果的解决方案

    (1)在 cygwin 中输入 ”bin/nutch org.apache.nutch.searcher.NutchBean csdn”测试是否已经抓取了页面,如果有结果,则说明有

    (2)查看tomcat的 webapps/nutch/WEB-INF/classes下的nutch-site.xml文件里,是否设置了searcher.dir属性,这是必须的

    (3)别忘了在设置完成后,要重启下tomcat。(注意每次修改nutch-site.xml 文件后都要重新启动tomcat)

    (4)貌似nutch/conf/nutch-site.xml也要设置searcher.dir属性,都进行设置

    中文乱码问题

    在文本框中输入关键字,就可以进行搜索了.不过用户在使用时会发现,对于英文单词的搜索一切正常,而当要搜索中文词语时会出现乱码。其实这个问题是 Tomcat设置的问题,解决办法是修改tomcat的配置文件,打开tomcat/conf下的server.xml文件,将其中的Connector 部分改成如下形式即可:

         <Connector port="8080" protocol="HTTP/1.1"

                    connectionTimeout="20000"

                    redirectPort="8443" />

    改为

         <Connector port="8080" protocol="HTTP/1.1"

                    connectionTimeout="20000"

                    redirectPort="8443"

                URIEncoding="UTF-8"

                useBodyEncodingForURI="true"/>

    然后重启 tomcat 即可。

    索引查看

    LukeAll 3.01打开爬行结果目录下的index目录

    注意:低版本Luke不能打开该文件,需要高版本的Luke,下载地址

    http://code.google.com/p/luke/downloads/list

    Dedian同志翻译的Doug Cutting 访谈录 -- 关于搜索引擎的开发

    http://www.blogjava.net/dedian/archive/2006/08/02/Doug_Cutting_Interview.html

    注:Doug Cutting是Lucene、Nutch的开发人员

    关于链接分析模块:

    你有实现你自己的PageRank或者WebRank算法系统在你的Nutch里吗?什么是你做网页排名(Ranking)的考虑?
    是的,Nutch里面有一个链接分析模块。它是可选的,因为对于站内搜索来说,网页排名是不需要的。

    Nutch目前对中文分词的支持还不够完善,从测试的结果来看它是将中文词语分成单独 的字进行处理的。但是瑕不掩瑜,作为一个开源的搜索引擎项目,Nutch的功能不仅可圈可点,而且从对它源代码的解读中可以使我们对搜索引擎的运行机理和 相关算法有了更加深入的了解。此外,Nutch优秀的设计架构使得用户能够非常容易的开发自己的插件,以实现个性化的需求与功能。相信随着Nutch不断 的改进和成熟,在不久的将来,基于Nutch的个人搜索引擎以及行业垂直搜索引擎会不断的涌现出来。

    下面部分转自:http://blog.csdn.net/liyang23456/archive/2007/08/20/1751253.aspx

    2.Nutch You should know

    2.1 一份文档

    nutch的文档不多,而且多是安装文档,要深入nutch,就必须一字不漏的阅读:

    Introduction to Nutch, Part 1 Crawling    和 Introduction to Nutch, Part 2 Searching

    然后就是看源码了,好在nutch的源码非常均匀,简短,没有花哨的技巧,很容易把事情看明白。

    2.2 三个目录

    首先理解nutch的三个数据目录:

    1.crawdb,linkdb 是web link目录,存放url 及url的互联关系,作为爬行与重新爬行的依据,页面默认30天过期。

    2.segments 是主目录,存放抓回来的网页。页面内容有bytes[]的raw content 和 parsed text的形式。nutch以广度优先的原则来爬行,因此每爬完一轮会生成一个segment目录。

    3.index 是lucene的索引目录,是indexs里所有index合并后的完整索引,注意索引文件只对页面内容进行索引,没有进行存储,因此查询时要去访问segments目录才能获得页面内容。

    3.Nutch 每条索引记录的字段

    url: 作为唯一标标识值,由BasicIndexingFilter类产生。

    segment: 由Indexer类产生。Nutch抓回来的页面内容放在segments目录,lucene只会索引,不会store原文内容,因此在查询时要以 segment与url作为外键,由FetchedSegments类根据hitsDetail从segments目录获得content。

    boost:优先级,由Indexer类调用插件计算产生。

    title:显示标题,在BasicIndexingFilter插件中被索引和存储。

    content: 主要的被搜索项,在BasicIndexingFilter插件中被索引。

  • 相关阅读:
    【转载】实时嵌入式软件开发的25个常见错误
    软件测试高级测评师培训-白盒测试所用工具
    SQL update select语句
    JS对URL字符串进行编码/解码分析
    Java利用jacob实现文档格式转换
    Web打印--Lodop API
    常用正则表达式
    截取视频第一帧作为预览图片
    plupload api
    URL特殊字符的转义
  • 原文地址:https://www.cnblogs.com/cy163/p/2912630.html
Copyright © 2011-2022 走看看