Nutch Crawler抓取数据并存储到MySQL

标签: nutch crawler 数据 | 发表时间:2013-03-07 22:17 | 作者:
出处:http://agiledon.github.com/

Apache Nutch是在Java平台上开发的开源网络爬虫工具。按照 Nutch官方网站给出的向导,通过使用Nutch命令,可以比较容易地抓取指定种子网站的数据。不过,若是要通过它提供的Java API,以编程方式抓取数据,并存储到指定的数据存储,如MySQL,则有一些技巧或者说秘诀需要注意。经过这几天抽空进行的试验,并查询了相关资料,完成了指定网站数据的抓取。

首先,需要准备好Nutch。目前Nutch的最新版本是2.1,在官方网站可以下载到2.1版本的源代码。奇怪的是,网站并未提供该版本的Bin下载。我们若是要通过Java API调用,则需要依赖于Nutch需要的Jar包。我们可以直接在自己的Java项目中导入这些Jar包,也可以在项目的pom.xml文件中指定Maven的Repository。

要直接导入Jar包,对于2.1版本而言,因为仅提供了源代码,所以在下载了Nutch之后,需要使用ant命令编译。编译后的Jar包会放在${NUTCH_HOME}下的runtime/local/lib下。如果想在pom.xml下管理依赖,而非直接导入,则需要查看Nutch 2.1究竟依赖了哪些Java库,并要了解这些库的版本。这个依赖管理还是比较麻烦的。所以,我在这里直接给出pom.xml文件。

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
      <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>NutchSample</groupId>
    <artifactId>NutchSample</artifactId>
    <version>1.0-SNAPSHOT</version>

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

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>

        <dependency>
            <groupId>org.apache.nutch</groupId>
            <artifactId>nutch</artifactId>
            <version>2.1</version>
        </dependency>

        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.2.8</version>
        </dependency>

        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-core</artifactId>
            <version>3.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-core</artifactId>
            <version>1.0.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-test</artifactId>
            <version>1.0.3</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.gora</groupId>
            <artifactId>gora-core</artifactId>
            <version>0.2.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.gora</groupId>
            <artifactId>gora-sql</artifactId>
            <version>0.1.1-incubating</version>
        </dependency>

        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>1.1</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>0.19.4</version>
        </dependency>

        <dependency>
            <groupId>org.restlet.jse</groupId>
            <artifactId>org.restlet</artifactId>
            <version>2.0.5</version>
        </dependency>

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
        </dependency>
    </dependencies>
</project>

注意,其中的mysql是后面存储抓取的数据时使用。pom.xml文件前面的maven-restlet的repository是restlet以及restlet.ext.jackson是独有的。因为这两个库必须在这个Repository下才能下载Jar包。

现在,假设我们已经通过maven建立了一个空白的Java项目,并且已经导入了依赖包,或者通过pom.xml下载了这些Jar包。接下来需要执行以下步骤:

建立种子文件

在项目的根目录下,建立urls目录,然后在目录下建立一个文本文件,文件名为seed.txt。内容是你要爬取的网站域名,例如:http://agiledon.github.com。如果要抓取多个网站,可以每行放一个网站域名。

复制配置文件

在项目main\resources目录下,创建文件夹nutchconf(文件夹名其实无关紧要,只要保证其下的文件都在classpath下即可。一个简单的做法是将resource目录设置为source root),然后到${NUTCH_HOME}\runtime\local\conf目录下,将里面所有的文件拷贝到你刚刚创建的文件夹下。

修改配置文件

首先,修改nutch-site.xml文件,将其设置为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      <configuration>
    <property>
        <name>http.agent.name</name>
        <value>my nutch spider</value>
    </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>Default class for storing data</description>
    </property>
</configuration>

修改gora.properties,增加mysql的设置:

1
2
3
4
      gora.sqlstore.jdbc.driver=com.mysql.jdbc.Driver
gora.sqlstore.jdbc.url=jdbc:mysql://localhost:3306/nutch?createDatabaseIfNotExist=true
gora.sqlstore.jdbc.user=root
gora.sqlstore.jdbc.password=

注意,jdbc.url值中的nutch为MySQL中数据库的名字,你可以根据自己的需要设置数据库名。前提是你要在MySQL中创建数据库。url值的createDatabaseIfNotExist=true,指代的是如果数据库中不存在该数据库,在运行Crawler时会自动创建。但是,对于MySQL而言,由于编码问题,可能会导致一些问题出现。因此,还是建议由自己创建。创建脚本在后面的链接提供。

接下来,打开gora-sql-mapping.xml,将WebPage映射文件的primarykey的length修改为767。

准备MySQL数据库

这里不再介绍如何安装MySQL数据库,如果是Mac Moutain Lion下安装MySQL,请参考我的博文《 使用HomeBrew在Moutain Lion上安装MySQL》。

因为编码的问题,要准备MySQL数据库还是一件麻烦事。在网上找到一篇文章 Setting up Nutch 2.1 with MySQL to handle UTF-8,很好地讲解了相关注意事项,并提供了脚本。我这里就不再赘述了。事实上,我们完全可以按照这篇文章来实现运用Nutch命令的方式抓取数据,并存储到MySQL。

调用Nutch Java API

Nutch本身提供了Crawler类来执行数据爬虫的命令。我们可以使用Hadoop的ToolRunner来运行Crawl工具。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
      public class MyCrawler {
    public static void main(String[] args) throws Exception {
        String crawlArg = "urls -depth 3 -topN 5";
        // Run Crawl tool
        try {
            ToolRunner.run(NutchConfiguration.create(), new Crawler(),
                    tokenize(crawlArg));
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
    }
    public static String[] tokenize(String str) {
        StringTokenizer tok = new StringTokenizer(str);
        String tokens[] = new String[tok.countTokens()];
        int i = 0;
        while (tok.hasMoreTokens()) {
            tokens[i] = tok.nextToken();
            i++;
        }
        return tokens;
    }
}

复制插件

因为Nutch在抓取数据时,需要对数据进行解析。解析过程中要调用插件urlnormalizer-basic的UrlNormalizer。所以,我们还需要将对应版本Nutch下的插件复制到我们的项目中来。你可以直接在项目的根目录下创建plugins目录,并将其设置为source root,然后将${NUTCH_HOME}\runtime\local\plugins下的插件复制到这个目录中。

接下来就可以运行MyCrawler应用了。注意,在运行该程序时,你一定要启动你的MySQL数据库。在Mac下,可以输入命令mysql.server start来启动。你可能会发现项目无法编译成功,因为某些插件依赖的对象无法找到。我猜测在运行ant时,并没有编译这些插件,使得这些插件的依赖库并没有完全获得。我采取了一种粗暴的做法,就是直接将这些无法编译通过的插件直接删除。至少,对于我们这个简单的抓取工作而言,事实上用不了这么多插件。

运行完成后,你可以到MySQL数据库下查询webpage数据表。如果运行成功,可以查询到表中的数据记录。如果运行失败,一方面可以在IDE工具的控制台上看到一些信息。另一方面也可以查询日志。日志记录会更详细,该文件可以在当前项目的根目录下找到,即hadoop.log日志文件。我在之前碰到的一个问题就是内存不够的异常,控制台上并未显示该信息,但在hadoop.log中能够找到,帮助我定位了问题。运行这样一个普通任务,把内存设置为512M就足够了。

相关 [nutch crawler 数据] 推荐:

Nutch Crawler抓取数据并存储到MySQL

- - 简单文本
Apache Nutch是在Java平台上开发的开源网络爬虫工具. 按照 Nutch官方网站给出的向导,通过使用Nutch命令,可以比较容易地抓取指定种子网站的数据. 不过,若是要通过它提供的Java API,以编程方式抓取数据,并存储到指定的数据存储,如MySQL,则有一些技巧或者说秘诀需要注意.

JAVA爬虫Nutch、WebCollector的正则约束

- - CSDN博客互联网推荐文章
爬虫爬取时,需要约束爬取的范围. 基本所有的爬虫都是通过正则表达式来完成这个约束. 代表"http://www.xinhuanet.com/"后加任意个任意字符(可以是0个). 通过这个正则可以约束爬虫的爬取范围,但是这个正则并不是表示爬取新华网所有的网页. 新华网并不是只有www.xinhuanet.com这一个域名,还有很多子域名,类似:news.xinhuanet.com.

nutch入门之本地安装运行

- - 开源软件 - ITeye博客
最近hadoop着实很火,平时玩hadoop没有数据也很头疼,还好有nutch这个开源框架,可以从网上爬取数据. 本身nutch也依赖hadoop来抓取数据,正好一举两得,. 在学习nutch的过程中也提高对hadoop的认识,下面我会在业余时间整体对nutch的安装部署使用做一个比较全的描述,希望大家也一起共同进步吧~~.

Nutch相关框架安装使用最佳指南

- - ITeye博客
五、安装Hadoop Cluster(伪分布式运行模式)并运行Nutch. 六、安装Hadoop Cluster(分布式运行模式)并运行Nutch. 七、配置Ganglia监控Hadoop集群和HBase集群. 八、Hadoop配置Snappy压缩. 九、Hadoop配置Lzo压缩. 十、配置zookeeper集群以运行hbase.

开源爬虫Labin,Nutch,Neritrix介绍和对比

- - 开源软件 - ITeye博客
larbin是个基于C++的web爬虫工具,拥有易于操作的界面,不过只能跑在LINUX下,在一台普通PC下larbin每天可以爬5百万个页面(当然啦,需要拥有良好的网络). Larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发. larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源.

基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

- - zzm
网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项. 由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎,用来对网络爬虫抓取到的网络资源进行实时的索引和搜索. 搜 索引擎架构在ElasticSearch之上,是一个典型的分布式在线实时交互查询架构,无单点故障,高伸缩、高可用.

数据仓库

- Ran - Linux@SOHU
翻译:马少兵、曾怀东、朱翊然、林业. 尽管服务器存储、处理能力得到有效的提高,以及服务器价格的降低,让人们能够负担起大量的服务器,但是商业软件应用和监控工具快速的增加,还是使得人们被大量的数据所困扰. 在数据仓库领域中的许多系统管理员、应用开发者,以及初级数据库管理员发现,他们正在处理“海量数据”-不管你准备与否-都会有好多不熟悉的术语,概念或工具.

数据抽取

- - 数据库 - ITeye博客
转自: http://wiki.mbalib.com/wiki/%E6%95%B0%E6%8D%AE%E6%8A%BD%E5%8F%96#.   数据抽取是指从源数据源系统抽取目的数据源系统需要的. 实际应用中,数据源较多采用的是. 数据迁移或数据复制,它将数据源中的表或视图的数据原封不动的从数 据库中抽取出来,并转换成自己的ETL 工具可以识别的格式.

数据库sharding

- - 数据库 - ITeye博客
当团队决定自行实现sharding的时候,DAO层可能是嵌入sharding逻辑的首选位置,因为在这个层面上,每一个DAO的方法都明确地知道需要访问的数据表以及查询参数,借助这些信息可以直接定位到目标shard上,而不必像框架那样需要对SQL进行解析然后再依据配置的规则进行路由. 另一个优势是不会受ORM框架的制约.

数据脱敏

- - IT瘾-bigdata
作者|李呈祥,其中部分内容由十一城补充. 数据脱敏(Data Masking),又称数据漂白、数据去隐私化或数据变形. 百度百科对数据脱敏的定义为:指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据 的可靠保护. 这样,就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集.