nutch介绍和安装配置

资料来源http://adt.haotui.com/thread-278-1-1.html

第一讲

一、简介

Nutch是什么

 Nutch是一个基于HadoopLucene的一个网络爬行器,用于收集网页信息。

特点

       基于Plugin机制以提高可扩展性;多协议和多线程分布式抓取;基于插件的内容分析机制;强大的抓取预处理控制;可扩展的数据处理模型(mapReduce);全文索引器和搜索引擎(Lucene or Solor),支持分布式查询;强大的API和集成配置。

Nutch和其他项目的关系

Lucene  Core(全文检索库)

Solr(企业搜索平台)

ElasticSearch(分布式的支持RESTFULL的实时搜索和实时分析)

Hadoop(分布式计算和分布式存储)

TikaMIME类型检测、语言检测、元数据和文本自动提取)

Gora(对象到NOSQL的映射)

二、一些必须的配置

版本

  1. Nutch 1.6版本、redhat 6.5

下载nutch1.6

2. nutch可以在http://www.apache.org/dyn/closer.cgi/nutch/中下载,也可以通过svn迁出https://svn.apache.org/repos/asf/nutch/tags/release-1.6/项目,也可以在其Subversion中下载最新版本

#svn检出Nutch1.6项目

[root@nutch   nutch2]# svn co https://svn.apache.org/repos/asf/nutch/tags/release-1.6/

 

3、进入release-1.6目录,手动编译nutch

#ant命令编译nutch1.6

[root@nutch release-1.6]# ant

注意:需要在build.xml所在目录中运行ant命令编译nutch

NutchIvy依赖管理工具

Nutch1.6版本中使用ivy依赖管理工具进行依赖管理。查看ivy.xml,可发现dependencies定义了nutch对第三方框架的依赖。所以nutch的源代码比较少,源代码中未包含第三方jar包,而是使用ivy依赖管理工具在编译的时候自动到网上进行下载。

#Nutchhadoop是通过nutch脚本bin/nutch连接起来的

Vi bin/nutch      #用此命令查看nutch脚本内容

Ant构建之后,生成runtime文件夹,在runtime下有localdeploy两个子文件夹,分别代表nutch的两种运行方式。

Deploy:使用hadoop的方式运行,数据存储在hdfs文件系统中

loca:使用本地文件系统来运行

deploylocal区别:

  • 数据的存储位置不同

  • local模式中对hadoop没有依赖

  • deploy运行方式必须将数据存储到hadoop,对hadoop依赖

nutch1.2之前,nutch的所有数据都是存储在hdfs中。它所有运算都是通过mapreduce编程模型来实现的,所以nutch的底层是hadoop

#查看bin/nutch脚本

[root@nutch local]# vi bin/nutch

通过查看bin/nutch脚本可以发现,在deploy模式下nutch是依赖于hadoop平台的。

NutchHadoop是通过什么连接起来的?

通过nutch脚本,hadoop命令把apache-nutch-1.6.job提交给hadoopJobTracker

4. 在其example目录下有一个bin/nutch脚本用来启动nutch,也可以用来看help帮助信息

#启动nutch

[root@nutch local]# bin/nutch

                                               172728_q8Cm_870039.jpg

三、bin/nutch下相关命令

Crawl 命令

crawl:对intranet进行一站式的爬取

很多时候我们需要根据自己的情况重写crawl类,或者使用脚本的方式,对需要执行的命令自定义。

#查看crawl命令用法

[root@nutch local]# bin/nutch crawl

Usage: Crawl <urlDir> -solr <solrURL> [-dir d] [-threads n] [-depth i] [-topN N]

初学时不知道每一个命令选项用于干嘛?这种情况下我们可以通过研读源代码的方式查看相应选项参数。

<urlDir>选项参数

#放置需要爬取的网站的url文件

[root@nutch local]# mkdir urls

#建立url文件,放置需要爬取的url网址

[root@nutch urls]# vi url

-solr <solrURL>选项参数

此参数可选,可加可不加

Nutch把网页爬取下来后,将爬取网页交给solr进行索引,之后用户通过solr来进行内容的搜索,Nutch本身并不做索引方面的工作,它只是把文档提交给solrsolr负责索引。

从这些可以看出,Nutch目前是一个网络爬虫,而不是一个搜索引擎。它的目标已经从搜索引擎蜕变为网络爬虫。

[-dir d]选项参数

爬取的页面保存地址

[-threads n]选项参数

因为现在是本地模式,在本地模式下只有一个map和一个reduce。在一个map和一个reduce的情况下,map/reduce的工作是串行的。

没办法充分利用cpu的多线程特性。虽然map/reduce不能并行,但是在网页抓取的过程中,即fetch阶段是可以使用多线程的。

[-depth i] 选项参数

抓取深度

四、抓取之前要做的一些配置

写一个urls文件用于生成crawlDB数据库;以urls/crawl.txt进行配置;修改conf/nutch-site.xml,加入<property><name>http.agent.name</name><value>test-nutch</value></property>信息;另外配置JAVA_HOME环境变量,一般在/usr/lib/jvm下会装有java的环境。

 

五、#运行crawl命令,爬取网页

[root@nutch local]#nohup bin/nutch crawl urls -dir data -threads 3 -depth 3 &

六、查找命令匹配的类

打开bin/nutch脚本,查找相关命令。如查找fetch命令所对应的类

[root@nutch local]# vi bin/nutch

按“/fetch”回车,再按“n”查找相匹配的下一条记录。

Nutch入门重点在于分析nutch脚本文件

上节回顾

第二讲

 

 

 

 

 

 

三、crawdblinkdbsegments目录

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

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

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

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

资料来源 http://adt.haotui.com/thread-278-1-1.html

 

四、输出日志分析

1.  我用了如下命令,其中dir为指定抓取目录,depth为抓取深度,输出日志如下:

 

lemo@lemo-laptop:~/Workspace/java/Apache/Nutch/nutch-1.2$ bin/nutch crawl urls -dir crawl.test -depth 1 

crawl started in: crawl.test <--- 抓取目录,抓取后有如下目录crawldbindexindexeslinkdb segments

rootUrlDir = urls <--- 初始化urls目录

threads = 10 <--- 抓取线程数

depth = 1 <--- 抓取深度

indexer=lucene <--- 索引器名字

<<<<<<<<<<<<<<<<<<<  Injector开始,urls目录合并到crawl db中去

Injector: starting at 2010-11-07 19:52:45

Injector: crawlDb: crawl.test/crawldb <--- inject的输出目录

Injector: urlDir: urls <--- 输入目录

Injector: Converting injected urls to crawl db entries. <--- 这里是对urls数据进行数据模型的转换

Injector: Merging injected urls into crawl db. <--- 这里利用MP计算模型来进行Inject操作

Injector: finished at 2010-11-07 19:52:48, elapsed: 00:00:03

<<<<<<<<<<<<<<<<<<<   Generate开始,产生适合抓取的urls

Generator: starting at 2010-11-07 19:52:48

Generator: Selecting best-scoring urls due for fetch. <--- urls进行分数计算,产生topN个进行抓取

Generator: filtering: true <--- 进行相应的urls过滤,这个在conf/regex-urlfilter.txt有配置

Generator: normalizing: true <--- 是否对urls进行规范化,这个在conf/regex-normalize.txt中配置

Generator: jobtracker is 'local', generating exactly one partition. <--- 没有使用MP,只是本地读取

Generator: Partitioning selected urls for politeness. <--- 

Generator: segment: crawl.test/segments/20101107195251

Generator: finished at 2010-11-07 19:52:52, elapsed: 00:00:03

<<<<<<<<<<<<<<<<<<<    Fetcher开始,进行Generator产生出来的urls进行抓取

Fetcher: Your 'http.agent.name' value should be listed first in 'http.robots.agents' property.

Fetcher: starting at 2010-11-07 19:52:52

Fetcher: segment: crawl.test/segments/20101107195251 <--- 抓取数据存放目录

Fetcher: threads: 10 <--- 抓取线程数,nutch是用了一个改进的work-crew的线程模型来进行网页抓取

QueueFeeder finished: total 1 records + hit by time limit :0

fetching http://www.baidu.com/ <--- 正在抓取的url

-finishing thread FetcherThread, activeThreads=8 <--- 每个线程结束抓取提示

-finishing thread FetcherThread, activeThreads=7

-finishing thread FetcherThread, activeThreads=6

-finishing thread FetcherThread, activeThreads=5

-finishing thread FetcherThread, activeThreads=4

-finishing thread FetcherThread, activeThreads=3

-finishing thread FetcherThread, activeThreads=2

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=1

-finishing thread FetcherThread, activeThreads=0

-activeThreads=0, spinWaiting=0, fetchQueues.totalSize=0 <--- 所有线程的一个状态和抓取队列状态

-activeThreads=0

Fetcher: finished at 2010-11-07 19:52:54, elapsed: 00:00:02

<<<<<<<<<<<<    dbupdate开始,把新生产的outlink等数据更新来原的crawldb数据库

CrawlDb update: starting at 2010-11-07 19:52:55

CrawlDb update: db: crawl.test/crawldb

CrawlDb update: segments: [crawl.test/segments/20101107195251]

CrawlDb update: additions allowed: true

CrawlDb update: URL normalizing: true

CrawlDb update: URL filtering: true

CrawlDb update: Merging segment data into db.

CrawlDb update: finished at 2010-11-07 19:52:56, elapsed: 00:00:01

<<<<<<<<<<<<< 更新linkDb数据库

LinkDb: starting at 2010-11-07 19:52:56

LinkDb: linkdb: crawl.test/linkdb

LinkDb: URL normalize: true

LinkDb: URL filter: true

LinkDb: adding segment: file:/home/lemo/Workspace/java/Apache/Nutch/nutch-1.2/crawl.test/segments/20101107195251

LinkDb: finished at 2010-11-07 19:52:58, elapsed: 00:00:01

<<<<<<<<<<<<<  index开始,对抓取数据进行索引

Indexer: starting at 2010-11-07 19:52:58

Indexer: finished at 2010-11-07 19:53:01, elapsed: 00:00:03

<<<<<<<<<<<<<  去重复数据

Dedup: starting at 2010-11-07 19:53:01

Dedup: adding indexes in: crawl.test/indexes

Dedup: finished at 2010-11-07 19:53:06, elapsed: 00:00:04

<<<<<<<<<<<<< 把新的索引与老的索引进行合并

IndexMerger: starting at 2010-11-07 19:53:06

IndexMerger: merging indexes to: crawl.test/index

Adding file:/home/lemo/Workspace/java/Apache/Nutch/nutch-1.2/crawl.test/indexes/part-00000

IndexMerger: finished at 2010-11-07 19:53:06, elapsed: 00:00:00

crawl finished: crawl.test

 

从上面的日志输出,

我们可以看出Nutch的抓取流程:inject->Generate->Fetch->Parse->UpdateCrawlDB->UpdateLinkDB->index shards

而数据流模型为:inject: urls->CrawlDB;

    generate: CrawlDB->segment(crawl_generate,对于哪些urls要进行generate呢?这里使用了静态和动态产生机制,静态的是那些带宽优先的、超过抓取时间的、高优先级的(PageRank)、新加入的。Fetchlist的产生一般会以topN的方式来产生,选择最优的后选者,这方面也有学者用遗传算法来实现,优先级由不同的因素来决定,一般是通过插件来实现的。动态的是那些自动检查网页更新频率和时间变化来决定网页的generate的优先级。

    fetch: crawl_generate->crawl_fetch+content

    crawldbupdate: parse_data->crawldb,把分析出的外链接更新到crawldb中,用于下一轮抓取

    linkdb: parse_data->linkdb,把提供出的锚文本、反向链接等信息放入linkdb

    indexer: CrawlDB,LinkDB,Segment->indexes,对抓取的数据进行全文索引

    Dedup: Segment->Segment,对网页进行去重,这里使用是的网页指纹的方法,对重复网页加删除标记

    IndexMerger:indexes->index,把新的索引合并到旧的索引中去

五、抓取数据模型

1. CrawlDB,用于存储所有的urls信息,包括抓取机制,抓取状态,网页指纹和元数据。

2. LinkDB,存储每一个url的连入锚链接和锚文本

3. Segment,原始的网页内容;解析后的网页;元数据;外链接;用于索引的元文本

资料来源于http://blog.csdn.net/amuseme_lu/article/details/5993916

六、 爬行过程

爬行过程在Introduction to Nutch, Part 1 Crawling 里已有详细说明,或许直接看Crawl类来理解爬行的过程。

资料来源 http://adt.haotui.com/thread-278-1-1.html

七、Nutch 的配置文件

Nutch 的配置文件几乎覆盖了Nutch 所有的功能。

资料来源http://adt.haotui.com/thread-278-1-1.html

八、nutch爬虫的分析与理解

资料来源http://adt.haotui.com/thread-278-1-1.html

九、Nutch Crawler工作流程及文件格式详细分析(2008-10-28 01:05:39)


 

 

转载于:https://my.oschina.net/HIJAY/blog/223941

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值