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

时间:2021-10-23 13:59:16

nutch2.x 在eclipse中实现抓取数据存进mysql步骤

最近在研究nutch,花了几天时间,也遇到很多问题,最终结果还是成功了,在此记录,并给其他有兴趣的人提供参考,共同进步。

对nutch的实现过程熟悉下,就可以实现电影采集网站了   如     无为电影在线

1、环境搭建

1)准备eclipse   安装Maven ,svn

2)在svn中下载官方2.x最新源码(参考官方http://wiki.apache.org/nutch/RunNutchInEclipse说明)

3)把工程转成maven工程,等系统下载依赖包

4)这时候可能有红叉,因为缺少jar包,这是pom的问题

<dependency>
<groupId>org.restlet.jse</groupId>
<artifactId>org.restlet</artifactId>
<version>2.0.5</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.restlet.jse</groupId>
<artifactId>org.restlet.ext.jackson</artifactId>
<version>2.0.5</version>
<optional>true</optional>
</dependency>

比如上面这段二个包就下载不下来。maven仓库没有。需要把restlet的私库加进来:

<repositories>
<repository>
<id>maven-restlet</id>
<name>Public online Restlet repository</name>
<url>http://maven.restlet.org</url>
</repository>
</repositories>

在pom.xml中增加这段,就可以下载了。

这时候按道理,应该就可以了,可是还有些问题,nutch2.x自身配的dadoop-core是1.1.1的版本,在windows环境下运行起来会有问题,如:会抛出权限异常:cause:java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-2070047262

在网上搜索这个异常,别人提供的办法是,使用hadoop-core-1.0.2-modified.jar (下载地址) 这个包可以不配到maven,加到Lib就可以,看各人爱好。

再按道理讲,这时候该没问题了吧,实践证明 ,还是不行,(先把配置讲完)pom中配的gora-core是最新版0.3,配置mysql的时候会有问题。要改成0.2.1.

另外增加gora-sql包

<dependency>
<groupId>org.apache.gora</groupId>
<artifactId>gora-core</artifactId>
<version>0.2.1</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.gora</groupId>
<artifactId>gora-sql</artifactId>
<version>0.1.1-incubating</version>
<exclusions>
<exclusion>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
</exclusion>
</exclusions>
</dependency>

另外还有这几个包要在pom中配置:

<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.ccil.cowan.tagsoup</groupId>
<artifactId>tagsoup</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>dk.brics.automaton</groupId>
<artifactId>automaton</artifactId>
<version>1.11-8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>

前3个包是插件代码中有引用到,没配置插件前不报错,但是后面还是要配的。最后一个是mysql的连接器,当然要配啦。
完整的pom文件

至此环境差不多,是不是特别麻烦,现在写出来都有这么多要改,在最开始不知道的时候,得花多少时间去应付报错,找问题。

5)安装mysql,创建数据库nutch:

CREATE DATABASE nutch DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;

还有建表:

CREATE TABLE `webpage` (
`id` varchar(255) NOT NULL,
`headers` blob,
`text` mediumtext DEFAULT NULL,
`status` int(11) DEFAULT NULL,
`markers` blob,
`parseStatus` blob,
`modifiedTime` bigint(20) DEFAULT NULL,
`score` float DEFAULT NULL,
`typ` 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

2、配置

把conf目录加到Source中,并在order and export中,放在top位置(见官方说明

配置插件:把src/plugin中,如下图加到Source中(src/plugin/插件名称/src/java)

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

这些是我们运行org.apache.nutch.crawl.Crawler类时所用到的插件。

下一步,配置文件的配置。

首先是nutch-site.xml的配置(nutch-default.xml这个文件不需要配置,网上有的说要修改这个,其实没有必要,这是默认配置,如果需要修改,我们可以在nutch-site.xml中这个属性,会覆盖nutch-default.xml中的属性)

把nutch-default中<!-- HTTP properties -->下面的一段http的属性复制过来,并给value赋值,默认是没有值的。

然后再增加插件和数据源的配置

<!-- plugin properties -->

<property>
<name>plugin.folders</name>
<value>./src/plugin</value>
<description>Directories where nutch plugins are located. Each
element may be a relative or absolute path. If absolute, it is used
as is. If relative, it is searched for on the classpath.</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> <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: org.apache.gora.sql.store.SqlStore
Default store. A DataStore implementation for RDBMS with a SQL interface.
SqlStore uses JDBC drivers to communicate with the DB. As explained in
ivy.xml, currently >= gora-core 0.3 is not backwards compatable with
SqlStore. org.apache.gora.cassandra.store.CassandraStore
Gora class for storing data in Apache Cassandra. org.apache.gora.hbase.store.HBaseStore
Gora class for storing data in Apache HBase. org.apache.gora.accumulo.store.AccumuloStore
Gora class for storing data in Apache Accumulo. org.apache.gora.avro.store.AvroStore
Gora class for storing data in Apache Avro. org.apache.gora.avro.store.DataFileAvroStore
Gora class for storing data in Apache Avro. DataFileAvroStore is
a file based store which uses Avro's DataFile{Writer,Reader}'s as a backend.
This datastore supports mapreduce. org.apache.gora.memory.store.MemStore
Gora class for storing data in a Memory based implementation for tests.
</description>
</property>

因为是mysql,所以store要使用

org.apache.gora.sql.store.SqlStore

其他的如网址过滤的配置,就不讲了,就是正则表达式,修改regex-urlfilter.txt就可以了。

还有个gora.properties文件要配置

gora.sqlstore.jdbc.driver=com.mysql.jdbc.Driver
gora.sqlstore.jdbc.url=jdbc:mysql://localhost:3306/nutch?createDatabaseIfNotExist=true
gora.sqlstore.jdbc.user=sa
gora.sqlstore.jdbc.password=888888

3、运行

在工程下新建个文件夹叫urls  里面建个文本文件如seed.txt  内容是一个网址如:http://www.qq.com

在run configuration 中配置java application  main class org.apache.nutch.crawl.Crawler

args配置:urls -depth 3 -topN 5

vm参数配:-Xms64m -Xmx512m    这项如果不配,会报内存溢出。

这时候就可以debug或者run了。按道理是可以出来了

4、其他修改

按道理讲,源码应该不用修改。事实证明,源码也有问题,运行的时候会出错。

GeneratorJob类在运行的时候会出现空指针异常,需要在163行run 方法内,增加:

   // generate batchId
int randomSeed = Math.abs(new Random().nextInt());
String batchId = (System.currentTimeMillis() / 1000) + "-" + randomSeed;
getConf().set(BATCH_ID, batchId);

5、最后

nutch2.x官方版本问题太多了,相当麻烦。写的过程中可能有遗漏,有问题及时交流。