zoukankan      html  css  js  c++  java
  • Nutch 2.2+MySQL实现网站内容的抓取和索引

    Nutch 2.2.1发布快两月了,该版本与Nutch之前版本相比,有较大变化,特别是与MySQL联合应用的安装和配置过程有不少地方容易出错。本人在安装过程中也遇到了不少麻烦,大多问题通过baidu和google也没有找到解决方法,自己只能通过看代码和分析日志并试错,最终搞定了所遇到的各种问题,现将重要安装和配置过程整理如下。

    1.  MySQL数据库配置

    l  my.ini配置

    分别在[client]、[mysql]下添加

    1
    default-character-set=utf8

    在[mysqld]下添加:

    1
    character-set-server=utf8

      

    l  权限授予

    1
    2
    3
    mysql –u root –p xxxx
     
    GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY  "xxxx";

      

    l  创建数据库与表

    手动创建数据库nutch和数据表webpage【如果不想用默认的库名和表名也可在nutch安装后的相关配置文件中进行修改,见后续说明】,其中webpage的表结构如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    CREATE TABLE `webpage` (
     
    `id` varchar(767) NOT NULL,
     
    `headers` blob,
     
    `text` longtext DEFAULT NULL,
     
    `status` int(11) DEFAULT NULL,
     
    `markers` blob,
     
    `parseStatus` blob,
     
    `modifiedTime` bigint(20) DEFAULT NULL,
     
    `prevModifiedTime` bigint(20) DEFAULT NULL,
     
    `score` float DEFAULT NULL,
     
    `typ` varchar(32) CHARACTER SET latin1 DEFAULT NULL,
     
    `batchId` varchar(32) CHARACTER SET latin1 DEFAULT NULL,
     
    `baseUrl` varchar(767) DEFAULT NULL,
     
    `content` longblob,
     
    `title` varchar(2048) DEFAULT NULL,
     
    `reprUrl` varchar(767) DEFAULT NULL,
     
    `fetchInterval` int(11) DEFAULT NULL,
     
    `prevFetchTime` bigint(20) DEFAULT NULL,
     
    `inlinks` mediumblob,
     
    `prevSignature` blob,
     
    `outlinks` mediumblob,
     
    `fetchTime` bigint(20) DEFAULT NULL,
     
    `retriesSinceFetch` int(11) DEFAULT NULL,
     
    `protocolStatus` blob,
     
    `signature` blob,
     
    `metadata` blob,
     
    PRIMARY KEY (`id`)
     
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

      

    注:表中的字段根据nutch的conf文件“gora-sql-mapping”进行设置。同时也可通过自动方式生成数据库和表:配置好“gora-sql-mapping”、“gora.properties”及其它文件后,首次通过运行”bin/nutch inject urls”即可自动生成数据库和表,不过或许在自动生成的时候你会遇到问题,不过没有关系,通过及时查看hadoop.log文件你便会发现很多问题(如下图之一)与MySQL支持的数据类型、数据长度有关,只需要根据日志提示做修改、调试(可借助navicat工具像SQL Server方便操作数据库),然后再重复自动生成过程,直到成功为止。



    2.  Nutch的安装与配置

    1)       获取nutch 2.2.x从官网http://www.apache.org/dyn/closer.cgi/nutch/下载,然后解压至本地安装目录,如本地根目录为 ${NUTCH_HOME};

    2)       配置nutchmysql的支持,修改${APACHE_NUTCH_HOME}/ivy/ivy.xml文件,分别:

    l  将以下行的注释取消

    1
    <dependency org=”mysql” name=”mysql-connector-java” rev=”5.1.18″ conf=”*->default”/>

      

    l  修改以下行。从默认的

    1
    <dependency org="org.apache.gora" name="gora-core" rev="0.3" conf="*->default"/>

     改成

    1
    <dependency org="org.apache.gora" name="gora-core" rev="0.2.1" conf="*->default"/>

      

    l  将以下行的注释取消

    1
    <dependency org="org.apache.gora" name="gora-sql" rev="0.1.1-incubating" conf="*->default" />

    注:上述第2和第3项,如果按默认的不做修改,将会在抓取网页时遇到以下错误。


    Exception in thread “main” Java.lang.ClassNotFoundException:org.apache.gora.sql.store.SqlStore

    3)       数据库连接配置

    编辑${NUTCH_HOME}/conf/gora.properties文件,注释掉默认的数据库连接配置,同时添加以下配置内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ###############################
     
    # Default MySQL properties    #
     
    ###############################
     
    gora.sqlstore.jdbc.driver=com.mysql.jdbc.Driver
     
     
    gora.sqlstore.jdbc.user=xxxx(MySQL用户名)
     
    gora.sqlstore.jdbc.password=xxxx(MySQL密码)

      

    4)       数据表映射配置

    主要是修改 ${NUTCH_HOME}/conf/gora.properties 文件,这里的修改建议按照前面介绍的自动生成数据表的方法进行修改,网上说的要将primarykey 的长度从512修改成767,即 <primarykey column=”id” length=”767″/>。反正我照此操作没有成功(应该受编码格式的影响),最后改成<primarykey column=”id” length=”255″/>搞定了。

    5)       修改nutch-site配置文件

    我的做法是直接将nutch-default文件另存为nutch-site,然后修改nutch-site内容,包括:

    l  添加http.agent.name的值

    1
    2
    3
    4
    5
    6
    7
    <property>
     
    <name>http.agent.name</name>
     
    <value>YourNutchSpider</value>
     
    </property>

      

    l  在文件末尾添加以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <property>
     
                 <name>http.accept.language</name>
     
                 <value>ja-jp, en-us,en-gb,en;q=0.7,*;q=0.3</value>
     
                 <description>Value of the Accept-Language request header field.
     
                 This allows selecting non-English language as default one to retrieve.
     
                 It is a useful setting for search engines build for certain national group.
     
                 </description>
     
        </property>
     
             
     
        <property>
     
                 <name>storage.data.store.class</name>
     
                 <value>org.apache.gora.sql.store.SqlStore</value>
     
                 <description>The Gora DataStore class for storing and retrieving data.
     
                 Currently the following stores are available:.
     
                 </description>
     
        </property>
     
             
     
    <property>
     
             <name>parser.character.encoding.default</name>
     
             <value>utf-8</value>
     
             <description>The character encoding to fall back to when no other information
     
             is available</description>
     
    </property>

      

    l  特别添加以下内容

    1
    2
    3
    4
    5
    6
    7
    <property>
     
        <name>generate.batch.id</name>
     
        <value>*</value>
     
    </property>

    如果不添加此项内容,则通过”bin/nutch crawl urls –threads n –depths n”爬取网页时,在日志中会看到以下错误:

    java.lang.NullPointerException 
    at org.apache.avro.util.Utf8.<init>(Utf8.java:37) 
    at org.apache.nutch.crawl.GeneratorReducer.setup(GeneratorReducer.java:100) 
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:174) 
    at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:649) 
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:418) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:398) 

    并且“nutch-site”文件需要保存为utf-8格式,否则在执行nutch命令时会出现以下错误。




     

    Exception in thread “main” java.lang.RuntimeException: com.sun.org.apache.xerces.internal.impl.io.malformedByteSequenceException: 1字节的UTF-8序列的字节 1 无效。

    6)       编译nutch 2.2

    在保证已安装ant的情况下(没有安装的可在网上baidu下ant的安装方法),回到nutch根目录,使用ant编译 ${NUTCH_HOME}。如果都按上述配置一步步做了,则编译过程将顺利完成。至此,Nutch 2.2的安装也已完成,接下来就可以根据需要配置网页抓取信息,进行网页抓取了。

    3.  网页抓取配置

    1)       设置抓取的网站

    1
    2
    3
    cd ${NUTCH_HOME}/runtime/local
    mkdir -p urls
    echo 'http://www.tianya.cn' > urls/seed.txt

      

    2)       执行爬取操作

    1
    bin/nutch crawl urls -depth 3 -topN 5

      

    执行完在mysql中即可查看到爬虫抓取的内容,如下图:

  • 相关阅读:
    听过闰年闰月,可你听过闰秒吗?
    在线学习的“后浪”:现代学习系统中的人工智能
    idea在service窗口中显示现有微服务启动类
    Intellij IDEA导入项目出现Cannot load settings from file错误
    HttpServletRequest的getRequestURL方法获取不到https协议请求问题
    新增gitignore无效的解决办法
    访问腾讯存储桶中的文件,跨域问题的解决
    线程池的创建方法推荐
    TreeMap在自定义排序时的坑
    vue.js功能学习
  • 原文地址:https://www.cnblogs.com/shininguang/p/4936781.html
Copyright © 2011-2022 走看看