原文地址: http://blog.sina.com.cn/s/blog_3c9872d00101p4f0.html

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

1.  MySQL数据库配置

l  my.ini配置

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

default-character-set=utf8

在[mysqld]下添加:

character-set-server=utf8

  

l  权限授予

mysql –u root –p xxxx

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY  "xxxx";

  

l  创建数据库与表

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

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  将以下行的注释取消

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

  

l  修改以下行。从默认的

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

 改成

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

  

l  将以下行的注释取消

<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文件,注释掉默认的数据库连接配置,同时添加以下配置内容:

###############################

# Default MySQL properties    #

###############################

gora.sqlstore.jdbc.driver=com.mysql.jdbc.Driver

gora.sqlstore.jdbc.url=jdbc:mysql://localhost:3306/nutch?createDatabaseIfNotExist=true

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的值

<property>

<name>http.agent.name</name>

<value>YourNutchSpider</value>

</property>

  

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

<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  特别添加以下内容

<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)       设置抓取的网站

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

  

2)       执行爬取操作

bin/nutch crawl urls -depth 3 -topN 5

  

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

Nutch 2.2+MySQL+Solr4.2实现网站内容的抓取和索引的更多相关文章

  1. HttpClient 4.x 执行网站登录并抓取网页的代码

    HttpClient 4.x 的 API 变化还是很大,这段代码可用来执行登录过程,并抓取网页. HttpClient API 文档(4.0.x), HttpCore API 文档(4.1) pack ...

  2. Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

    概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...

  3. 抓取网站数据不再是难事了,Fizzler(So Easy)全能搞定

    首先从标题说起,为啥说抓取网站数据不再难(其实抓取网站数据有一定难度),SO EASY!!!使用Fizzler全搞定,我相信大多数人或公司应该都有抓取别人网站数据的经历,比如说我们博客园每次发表完文章 ...

  4. Nutch的配置以及动态网站的抓取

    http://blog.csdn.net/jimanyu/article/details/5619949 一:配置Nutch: 1.解压缩的nutch后,以抓取http://www.163.com/为 ...

  5. MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能

    MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能 Clicks: Date: -- :: Power By 李轩Lane TagMysql计数器高性能 现在有很多的项目,对计数器的实现 ...

  6. springMVC+angular+bootstrap+mysql的简易购物网站搭建

    springMVC+angular+bootstrap+mysql的简易购物网站搭建 介绍 前端的css框架用了bootstrap, 以及bootstrap的JS组件, 以及很好用的angular(a ...

  7. 一个基于php+mysql的外卖订餐网站(带源码)

    订饭组 一个基于php+mysql的外卖订餐网站,包括前端和后台.源码地址 源码演示地址:http://dingfanzu.com 商家后台系统:http://dingfanzu.com/admin ...

  8. windows环境下nutch2.x 在eclipse中实现抓取数据存进mysql详细步骤

    nutch2.x 在eclipse中实现抓取数据存进mysql步骤 最近在研究nutch,花了几天时间,也遇到很多问题,最终结果还是成功了,在此记录,并给其他有兴趣的人提供参考,共同进步. 对nutc ...

  9. 10个开源的PHP网站内容管理系统

    1. DEDE -这是一款国内开源的cms,作者是一个个人,能做出如此功能的cms,是相当不错的.2007版功能十分强大,希望能改善之前数据量一大,更新静态页就很慢的缺点.因为开源,有较多的玩家和拥护 ...

随机推荐

  1. angular2 问题请教

    angular2 通过http服务进行对后端api的远程调用? 我简单的尝试了一下,发现了几个问题,记录一下,以方便查找问题. angular2 http服务的跨域问题?跨域本身就是一个很复杂的问题, ...

  2. synchronized使用说明

    好久没有更新博客了,今天试着用简单的语言把synchronized的使用说清楚. synchronized是什么? synchronized是用来保证在多线程环境下代码同步执行的可重入的互斥锁.所谓互 ...

  3. 使用JavaScript获取日期加随机数生成单号

    今天学习Javascript,得到一个自动生成单号的JavaScript,留下日后备用: function getNowFormatDate() { var day = new Date(); var ...

  4. mybatis 中的where标签

    mybatis中的where标签可以去除 开头的 and 或者 or 但是放在后面的不行 失败的: <select id="countNotesByParam" parame ...

  5. Node.js实现CORS跨域资源共享

    什么是CORS CORS(Cross-origin resource sharing),跨域资源共享,是一份浏览器技术的规范,用来避开浏览器的同源策略 简单来说就是解决跨域问题的除了jsonp外的另一 ...

  6. day9-paramiko

    一.基于用户名密码认证SSH连接 #!/usr/bin/env python #coding:utf8 import paramiko ssh = paramiko.SSHClient()#创建SSH ...

  7. iOS开发——网络篇——文件下载(NSMutableData、NSFileHandle、NSOutputStream)和上传、压缩和解压(三方框架ZipArchive),请求头和请求体格式,断点续传Range

    一.小文件下载 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion ...

  8. DOM的概念及子节点类型

    前言 DOM的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容).浏览器会根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组 ...

  9. Observer设计模式中-委托事件-应用在消息在窗体上显示

    Observer设计模式:监视者模式.在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体. 因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名, ...

  10. codeiginter框架数据库操作

       /**      *  //查询表内的数据      *  $res = $this->db->get('表名');      *  $res->result();       ...