- 浏览: 200046 次
- 性别:
- 来自: 北京
最新评论
-
毛毛虫小白:
您好,这里说的基于角色标注就是用到了字体位频率表里,在“名字内 ...
介绍一种基于角色标注+字词体位法的人名识别方式-Ansj中文分词 -
assasszt:
请问 能不能加入写入文件功能,不然的话 是每次 执行 都是一个 ...
Java版本的BloomFilter (布隆过滤器) -
lhj_6270:
楼主不错。果然不是一般人。再接再厉弄个软件出来。
Java版本的BloomFilter (布隆过滤器) -
ansjsun:
fncj 写道你好,我们最近要搞一个人名识别功能,发现有两个问 ...
介绍一种基于角色标注+字词体位法的人名识别方式-Ansj中文分词 -
fncj:
你好,我们最近要搞一个人名识别功能,发现有两个问题:1、里有不 ...
介绍一种基于角色标注+字词体位法的人名识别方式-Ansj中文分词
http://blog.csdn.net/kauu/archive/2007/10/14/1823830.aspx
Crawler和Searcher两部分被尽是分开,其主要目的是为了使两个部分可以布地配置在硬件平台上,例如Crawler和Searcher分别被放置在两个主机上,这样可以极大的提高灵活性和性能。
一、相关的数据结构
Crawl DB
● CrawlDb 是一个包含如下结构数据的文件:
<URL, CrawlDatum>
● CrawlDatum:
<status, date, interval, failures, linkCount, ...>
● Status:
{db_unfetched, db_fetched, db_gone,linked, fetch_success, fetch_fail, fetch_gone}
爬虫Crawler:
Crawler的工作流程包括了整个nutch的所有步骤--injector,generator,fetcher,parse Segment, update CrawleDB,Invert links, Index ,Delete Duplicates, Index Merger。
Crawler涉及的数据文件格式和含义,和以上的各个步骤相关的文件分别被存放在物理设备上的以下五个文件夹里:crawldb,segments,indexes,linkdb,index。
那么各个步骤和流程是怎么,各个文件夹里又是放着什么呢?观察Crawler类可以知道它的流程。
1、Injector injector = new Injector(conf); //Crawl.java line 104
Usage: Injector <crawldb> <url_dir>
首先是建立起始url集,每个url都经过URLNormalizers、filter和scoreFilter三个过程并标记状态。首先经过的plugin是normalizer ,把url进行标准化,比如basicnomalizer( package org.apache.nutch.net.urlnormalizer.basic ) 的作用有把大写的url标准化为小写,把空格去除等等。然后再经过的plugin 是filter,可以根据你写的正则表达式把想要的url留下来。经过两个步骤后,然后就是把这个url进行状态标记,每个url都对应着一个 CrawlDatum,这个类对应着每个url在所有生命周期内的一切状态。细节上还有这个url处理的时间和初始时的分值。
同时,在这个步骤里,会在文件系统里生成如下文件夹crawlDB\current\part-00000, 这个文件夹里还有.data.crc , .index.crc, data, index四个文件
● MapReduce1: 把输入的文件转换成DB格式
In: 包含urls的文本文件
Map(line) → <url, CrawlDatum>; status=db_unfetched
Reduce() is identity;
Output: 临时的输出文件夹
● MapReduce2: 合并到现有的DB
Input: 第一步的输出和已存在的DB文件
Map() is identity.
Reduce: 合并CrawlDatum成一个实体(entry)
Out: 一个新的DB
2、Generator generator = new Generator(conf);
//Generates a subset of a crawl db to fetch
Usage: Generator <crawldb> <segments_dir> [-force] [-topN N] [-numFetchers numFetchers] [-adddays numDays] [-noFilter]
在这个步骤里,Generator一共做了四件事情,
1、给前面injector完成的输出结果里按分值选出前topN个url,作为一个fetch的子集。
2、根据第一步的结果检查是否已经选取出一些url,CrawlDatum的实体集。
3、再次转化,此次要以url的host来分组,并以url的hash来排序。
4、根据以上的步骤的结果来更新crawldb(injector产生)。
● MapReduce1: 根据要求选取一些要抓取的url
In: Crawl DB 文件
Map() → if date≥now, invert to <CrawlDatum, url>
Partition 以随机的hash值来分组
Reduce:
compare() 以 CrawlDatum.linkCount的降序排列
output only top-N most-linked entries
● MapReduce2: 为下一步抓取准备
Map() is invert; Partition() by host, Reduce() is identity.
Out: 包含<url,CrawlDatum> 要并行抓取的文件
3、Fetcher fetcher = new Fetcher(conf);
//The fetcher. Most of the work is done by plugins
Usage: Fetcher <segment> [-threads n] [-noParsing]
这个步骤里,Fetcher所做的事情主要就是抓取了,同时也完成一些其它的工作。首先,这是一个多线程的步骤,默认以10个线程去抓取。根据抓取回来后的结果状态来进行不同的标记,存储,再处理等等行为。输入是上一步骤Generator产生的segment文件夹,这个步骤里,考虑到先前已经按照ip 或host来patition了,所以在此就不再把input文件进行分割了。程序继承了SequenceFileInputFormat重写了 inputFormat来达到这点。这个类的各种形为都是插件来具体完成的,它只是一个骨架一样为各种插件提供一个平台。它先根据url来取出具体的 protocol,得到protocolOutput,进而得到状态status及内容content。然后,根据抓取的状态status来继续再处理。再处理时,首先会将这次抓取的内容content、状态status及它的状态标记进行存储。这个存储的过程中,还会记下抓取的时间,再把segment 存过metadata,同时在分析parsing前经过scoreFilter,再用parseUtil(一系列的parse插件)进行分析,分析后再经过一次score插件的处理。经过这一系列处理后,最后进行输出(url,fetcherOutput)。
之前讲到根据抓取回来的各种状态,进行再处理,这些状态一共包括12种,比如当抓取成功时,会像上刚讲的那样先存储结果,再判断是否是链接跳转,跳转的次数等等处理。
● MapReduce:抓取
In: <url,CrawlDatum>, 以host分区, 以hash值排序
Map(url,CrawlDatum) → <url, FetcherOutput>
多线程的, 同步的map实现
调用已有的协议protocol插件
FetcherOutput: <CrawlDatum, Content>
Reduce is identity
Out: 两个文件: <url,CrawlDatum>, <url,Content>
4、 ParseSegment parseSegment = new ParseSegment(conf);
//Parse content in a segment
Usage: ParseSegment segment
对于这个步骤的逻辑比较简单,只是对抓取后上一步骤存储在segment里的content进行分析parse。同样,这个步骤的具体工作也是由插件来完成的。
MapReduce: 分析内容
In: <url, Content> 抓取来的内容
Map(url, Content) → <url, Parse>
调用分析插件parser plugins
Reduce is identity.
Parse: <ParseText, ParseData>
Out: 分割成三个文件: <url,ParseText>, <url,ParseData> 和<url,CrawlDatum> 为了outlinks.
5、CrawlDb crawlDbTool = new CrawlDb(conf);
//takes the output of the fetcher and updates the crawldb accordingly.
Usage: CrawlDb <crawldb> (-dir <segments> | <seg1> <seg2> ...) [-force] [-normalize] [-filter] [-noAdditions]
这个类主要是根据fetcher的输出去更新crawldb。 map和reduce分别做了两方面的事情,在map里是对url的nomalizer,和filte,在reduce里是对新抓取进来的页面(CrawlDatum)和原先已经存在的进行合并。
MapReduce:合并抓取的和分析后的输出到crawldb里
In: <url,CrawlDatum>现有的db加上抓取后的和分析后的输出
Map() is identity
Reduce() 合并所有实体(entry)成一个,以抓取后的状态覆盖原先的db状态信息,统计出分析后的链接数
Out: 新的crawl db
6.LinkDb linkDbTool = new LinkDb(conf);
//Maintains an inverted link map, listing incoming links for each url.
Usage: LinkDb <linkdb> (-dir <segmentsDir> | <seg1> <seg2> ...) [-force] [-noNormalize] [-noFilter]
这个类的作用是管理新转化进来的链接映射,并列出每个url的外部链接(incoming links)。先是对每一个url取出它的outLinks,作map操作把这个url作为每个outLinks的incoming link,在reduce里把根据每个key来把一个url的所有incoming link都加到inlinks里。这样就把每个url的外部链接统计出来了。然后一步是对这些新加进来的链接进行合并。
● MapReduce: 统计每个链接的外部链接
In: <url,ParseData>, 包含所有链接的分析后的结果
Map(srcUrl, ParseData> → <destUrl, Inlinks>
为每个链出链接收集一个入链。
Inlinks: <srcUrl, anchorText>*
Reduce()加上外部入链数量
Out: <url, Inlinks>, 一个相关完整的链接地图
7.Indexer indexer = new Indexer(conf);
//Create indexes for segments
Usage: <index> <crawldb> <linkdb> <segment> ...
这个类的任务是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是为前面爬虫抓取回来的数据进行索引好让用户可以搜索到这些数据。这里的输入就比较多了,有segments下的fetch_dir,parseData和parseText,还有crawldb下的 current_dir和linkdb下的current_dir。在这个类里,map也不做,在reduce时处理。当然要把这些数据体组合成一个 lucene的document让它索引了。在reduce里组装好后收集时是<url,doc>,最后在输出的OutputFormat类里进行真正的索引。
● MapReduce: 生成lucene的索引文件
In: 外个文件, values 以 <Class, Object>包装
<url, ParseData> from parse, 有title, metadata, 等等信息.
<url, ParseText> from parse, 文本 text
<url, Inlinks> from invert, 锚文本anchors
<url, CrawlDatum> from fetch,用于抓取
Map() is identity
Reduce() 生成Lucene Document
调用index插件
Out: 建立Lucene 索引; 最后存储到文件系统上
8. DeleteDuplicates dedup = new DeleteDuplicates(conf);
//这个类的作用就是它的名字了。
Usage: DeleteDuplicates <indexes> ...
这个类的作用就是这它的名字所写的意思--去重。前面索引后(当然不是一次时的情况)会有重复,所以要去重。为什么呢,在一次索引时是不重复的,可是多次抓取后就会有重复了。就是这个原因才要去重。当然去重的规则有两种一个是以时间为标准,一种是以内容的md5值为标准。
9.IndexMerger merger = new IndexMerger(conf);
IndexMerger [-workingdir <workingdir>] outputIndex indexesDir...
这个类就比较简单了,把所有的小索引合并成一个索引。在这一步没有用到map-reduce。
在这九大步骤中generator,fetcher,parseSegment,crawlDbTool会根据抓取的层数循环运行,当抓取的层数大于1时会运行linkInvert,index,dedup,和merge
Crawler和Searcher两部分被尽是分开,其主要目的是为了使两个部分可以布地配置在硬件平台上,例如Crawler和Searcher分别被放置在两个主机上,这样可以极大的提高灵活性和性能。
一、相关的数据结构
Crawl DB
● CrawlDb 是一个包含如下结构数据的文件:
<URL, CrawlDatum>
● CrawlDatum:
<status, date, interval, failures, linkCount, ...>
● Status:
{db_unfetched, db_fetched, db_gone,linked, fetch_success, fetch_fail, fetch_gone}
爬虫Crawler:
Crawler的工作流程包括了整个nutch的所有步骤--injector,generator,fetcher,parse Segment, update CrawleDB,Invert links, Index ,Delete Duplicates, Index Merger。
Crawler涉及的数据文件格式和含义,和以上的各个步骤相关的文件分别被存放在物理设备上的以下五个文件夹里:crawldb,segments,indexes,linkdb,index。
那么各个步骤和流程是怎么,各个文件夹里又是放着什么呢?观察Crawler类可以知道它的流程。
1、Injector injector = new Injector(conf); //Crawl.java line 104
Usage: Injector <crawldb> <url_dir>
首先是建立起始url集,每个url都经过URLNormalizers、filter和scoreFilter三个过程并标记状态。首先经过的plugin是normalizer ,把url进行标准化,比如basicnomalizer( package org.apache.nutch.net.urlnormalizer.basic ) 的作用有把大写的url标准化为小写,把空格去除等等。然后再经过的plugin 是filter,可以根据你写的正则表达式把想要的url留下来。经过两个步骤后,然后就是把这个url进行状态标记,每个url都对应着一个 CrawlDatum,这个类对应着每个url在所有生命周期内的一切状态。细节上还有这个url处理的时间和初始时的分值。
同时,在这个步骤里,会在文件系统里生成如下文件夹crawlDB\current\part-00000, 这个文件夹里还有.data.crc , .index.crc, data, index四个文件
● MapReduce1: 把输入的文件转换成DB格式
In: 包含urls的文本文件
Map(line) → <url, CrawlDatum>; status=db_unfetched
Reduce() is identity;
Output: 临时的输出文件夹
● MapReduce2: 合并到现有的DB
Input: 第一步的输出和已存在的DB文件
Map() is identity.
Reduce: 合并CrawlDatum成一个实体(entry)
Out: 一个新的DB
2、Generator generator = new Generator(conf);
//Generates a subset of a crawl db to fetch
Usage: Generator <crawldb> <segments_dir> [-force] [-topN N] [-numFetchers numFetchers] [-adddays numDays] [-noFilter]
在这个步骤里,Generator一共做了四件事情,
1、给前面injector完成的输出结果里按分值选出前topN个url,作为一个fetch的子集。
2、根据第一步的结果检查是否已经选取出一些url,CrawlDatum的实体集。
3、再次转化,此次要以url的host来分组,并以url的hash来排序。
4、根据以上的步骤的结果来更新crawldb(injector产生)。
● MapReduce1: 根据要求选取一些要抓取的url
In: Crawl DB 文件
Map() → if date≥now, invert to <CrawlDatum, url>
Partition 以随机的hash值来分组
Reduce:
compare() 以 CrawlDatum.linkCount的降序排列
output only top-N most-linked entries
● MapReduce2: 为下一步抓取准备
Map() is invert; Partition() by host, Reduce() is identity.
Out: 包含<url,CrawlDatum> 要并行抓取的文件
3、Fetcher fetcher = new Fetcher(conf);
//The fetcher. Most of the work is done by plugins
Usage: Fetcher <segment> [-threads n] [-noParsing]
这个步骤里,Fetcher所做的事情主要就是抓取了,同时也完成一些其它的工作。首先,这是一个多线程的步骤,默认以10个线程去抓取。根据抓取回来后的结果状态来进行不同的标记,存储,再处理等等行为。输入是上一步骤Generator产生的segment文件夹,这个步骤里,考虑到先前已经按照ip 或host来patition了,所以在此就不再把input文件进行分割了。程序继承了SequenceFileInputFormat重写了 inputFormat来达到这点。这个类的各种形为都是插件来具体完成的,它只是一个骨架一样为各种插件提供一个平台。它先根据url来取出具体的 protocol,得到protocolOutput,进而得到状态status及内容content。然后,根据抓取的状态status来继续再处理。再处理时,首先会将这次抓取的内容content、状态status及它的状态标记进行存储。这个存储的过程中,还会记下抓取的时间,再把segment 存过metadata,同时在分析parsing前经过scoreFilter,再用parseUtil(一系列的parse插件)进行分析,分析后再经过一次score插件的处理。经过这一系列处理后,最后进行输出(url,fetcherOutput)。
之前讲到根据抓取回来的各种状态,进行再处理,这些状态一共包括12种,比如当抓取成功时,会像上刚讲的那样先存储结果,再判断是否是链接跳转,跳转的次数等等处理。
● MapReduce:抓取
In: <url,CrawlDatum>, 以host分区, 以hash值排序
Map(url,CrawlDatum) → <url, FetcherOutput>
多线程的, 同步的map实现
调用已有的协议protocol插件
FetcherOutput: <CrawlDatum, Content>
Reduce is identity
Out: 两个文件: <url,CrawlDatum>, <url,Content>
4、 ParseSegment parseSegment = new ParseSegment(conf);
//Parse content in a segment
Usage: ParseSegment segment
对于这个步骤的逻辑比较简单,只是对抓取后上一步骤存储在segment里的content进行分析parse。同样,这个步骤的具体工作也是由插件来完成的。
MapReduce: 分析内容
In: <url, Content> 抓取来的内容
Map(url, Content) → <url, Parse>
调用分析插件parser plugins
Reduce is identity.
Parse: <ParseText, ParseData>
Out: 分割成三个文件: <url,ParseText>, <url,ParseData> 和<url,CrawlDatum> 为了outlinks.
5、CrawlDb crawlDbTool = new CrawlDb(conf);
//takes the output of the fetcher and updates the crawldb accordingly.
Usage: CrawlDb <crawldb> (-dir <segments> | <seg1> <seg2> ...) [-force] [-normalize] [-filter] [-noAdditions]
这个类主要是根据fetcher的输出去更新crawldb。 map和reduce分别做了两方面的事情,在map里是对url的nomalizer,和filte,在reduce里是对新抓取进来的页面(CrawlDatum)和原先已经存在的进行合并。
MapReduce:合并抓取的和分析后的输出到crawldb里
In: <url,CrawlDatum>现有的db加上抓取后的和分析后的输出
Map() is identity
Reduce() 合并所有实体(entry)成一个,以抓取后的状态覆盖原先的db状态信息,统计出分析后的链接数
Out: 新的crawl db
6.LinkDb linkDbTool = new LinkDb(conf);
//Maintains an inverted link map, listing incoming links for each url.
Usage: LinkDb <linkdb> (-dir <segmentsDir> | <seg1> <seg2> ...) [-force] [-noNormalize] [-noFilter]
这个类的作用是管理新转化进来的链接映射,并列出每个url的外部链接(incoming links)。先是对每一个url取出它的outLinks,作map操作把这个url作为每个outLinks的incoming link,在reduce里把根据每个key来把一个url的所有incoming link都加到inlinks里。这样就把每个url的外部链接统计出来了。然后一步是对这些新加进来的链接进行合并。
● MapReduce: 统计每个链接的外部链接
In: <url,ParseData>, 包含所有链接的分析后的结果
Map(srcUrl, ParseData> → <destUrl, Inlinks>
为每个链出链接收集一个入链。
Inlinks: <srcUrl, anchorText>*
Reduce()加上外部入链数量
Out: <url, Inlinks>, 一个相关完整的链接地图
7.Indexer indexer = new Indexer(conf);
//Create indexes for segments
Usage: <index> <crawldb> <linkdb> <segment> ...
这个类的任务是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是为前面爬虫抓取回来的数据进行索引好让用户可以搜索到这些数据。这里的输入就比较多了,有segments下的fetch_dir,parseData和parseText,还有crawldb下的 current_dir和linkdb下的current_dir。在这个类里,map也不做,在reduce时处理。当然要把这些数据体组合成一个 lucene的document让它索引了。在reduce里组装好后收集时是<url,doc>,最后在输出的OutputFormat类里进行真正的索引。
● MapReduce: 生成lucene的索引文件
In: 外个文件, values 以 <Class, Object>包装
<url, ParseData> from parse, 有title, metadata, 等等信息.
<url, ParseText> from parse, 文本 text
<url, Inlinks> from invert, 锚文本anchors
<url, CrawlDatum> from fetch,用于抓取
Map() is identity
Reduce() 生成Lucene Document
调用index插件
Out: 建立Lucene 索引; 最后存储到文件系统上
8. DeleteDuplicates dedup = new DeleteDuplicates(conf);
//这个类的作用就是它的名字了。
Usage: DeleteDuplicates <indexes> ...
这个类的作用就是这它的名字所写的意思--去重。前面索引后(当然不是一次时的情况)会有重复,所以要去重。为什么呢,在一次索引时是不重复的,可是多次抓取后就会有重复了。就是这个原因才要去重。当然去重的规则有两种一个是以时间为标准,一种是以内容的md5值为标准。
9.IndexMerger merger = new IndexMerger(conf);
IndexMerger [-workingdir <workingdir>] outputIndex indexesDir...
这个类就比较简单了,把所有的小索引合并成一个索引。在这一步没有用到map-reduce。
在这九大步骤中generator,fetcher,parseSegment,crawlDbTool会根据抓取的层数循环运行,当抓取的层数大于1时会运行linkInvert,index,dedup,和merge
发表评论
-
介绍一种基于角色标注+字词体位法的人名识别方式-Ansj中文分词
2012-09-14 13:35 7099大家好.最近在做分词.在分词中遇到了各种各样的问题 ... -
介绍一种基于角色标注+字词体位法的人名识别方式-Ansj中文分词
2012-09-14 13:04 13大家好.最近在做分词.在分词中遇到了各种各样的问题 ... -
Combining Probabilities-结合概率
2012-04-19 14:23 0这就是联合概率的计算公式 介绍..原文 htt ... -
贝叶斯学习笔记
2012-04-19 11:21 1574一.什么是贝叶斯 ... -
大话字符编码发展史
2012-04-06 17:17 3718ASCII码 ASCII码于1968年提出,用于在不同计 ... -
新浪微博采集利用javascript爬取
2012-02-16 16:17 85在一个群里有人问新浪微博的抓取. 因为需求特殊..试了一次通 ... -
元宵爬虫-YuanXiaoSpider
2012-02-06 12:25 4533翻译了下..没有元宵的淫文啊....所以用PinYing吧.. ... -
到1亿的自然数,求所有数的拆分后的数字之和
2012-02-02 16:57 2082public static void main(String[ ... -
<<这就是搜索引擎>>学习笔记-算法之索引压缩
2012-01-19 16:20 2269前一段时间.在微博上中奖了. 一个叫张俊林的帅锅.送了俺一本书 ... -
文本相似度计算-Levenshtein
2012-01-13 11:26 1990参见网址http://www.merriamp ... -
一个不会重复的HelloWord 随机大小写....
2011-12-01 16:53 1160一个不会重复的HelloWord 随机大小写.... 代码没有 ... -
简单版数独计算器-升级版
2011-11-03 12:28 1649只能算初级的..高级的就溢出了 就算内存无穷大.可能性超过 ... -
java算法专题-归并排序
2011-11-02 21:32 1398归并的思想就是分治.时间复杂度..忘记了 大概实现了下..还 ... -
一个关键字标红的通用类
2011-09-15 20:32 3373import java.lang.reflect.Array; ... -
二分法查找
2011-09-13 15:03 1730import java.util.Arrays; / ... -
二叉树法插入查找例子
2011-09-13 14:52 1380二分法查找...查找... 代码比较简单...没有注释了 ... -
java Hash算法大全(转载的)
2011-09-09 00:05 2757/** * Hash算法大全<br> * 推荐 ... -
Java版本的BloomFilter (布隆过滤器)
2011-09-08 17:38 11028哈哈...我终于写了个BloomFilter 这个是干嘛用的 ... -
BitMap 用于查重..只能查数字
2011-09-01 10:26 2549package ansj.sun.util; public ... -
2B高亮.单位要用凑合用吧..自己趁着老婆洗狗的时候写的
2011-08-29 21:12 1385没有用任何算法.没有用 ...
相关推荐
Nutch爬虫工作流程及文件格式详细分析!!!!!
Nutch爬虫工作流程及文件格式详细分析,文档不大
描述Nutch的工作流程,介绍Nutch对页面获取、分析、建立索引的过程。
1.1 Nutch 基本原理 1.1.1 Nutch 基本组成 1.1.2 Nutch 工作流程 1.2 Nutch 流程详解 1.2.1 Nutch 数据流程 1.2.2 Nutch 流程分析
资源中urls.txt是我nutch单步执行过程的种子文件,里面的ppt主要讲解nutch单步执行流程,并获取每次单步执行的结果文件,对文件进行分析,同时ppt还讲解了nutch的插件的基础知识,不是很详细,但是可以作为参考。...
Nutch的配置文件主要有三类: 1.Hadoop的配置文件,Hadoop-default.xml和Hadoop-site.xml。 2.Nutch的配置文件,Nutch-default.xml和Nutch-site.xml。 3.Nutch的插件的配置文件,这些插件的配置文件在加载插件的时候...
1 Nutch简介 2 1.1 nutch体系结构 2 2 抓取部分 3 2.1 爬虫的数据结构及含义 3 2.2 抓取目录分析 4 2.3 抓取过程概述 4 2.4 抓取过程分析 5 ...3 配置文件分析 3.1 nutch-default.xml分析 31 …………
mp3文件信息解析。支持ID3标准的V1和V2.3.可以再nutch中使用。宁外附上nutch的parse-html的一些定制。(图片,关键字匹配)
5. nutch工作流程分析...25 5.1 爬虫...25 5.1.1 工作策略...25 5.1.2 工作流程分析....25 5.1.3 其它..27 5.2 索引...27 5.2.1 索引主要过程....27 5.2.2 工作流程分析....28 5.2.3 倒排索引(inverted index)....29...
Tika使用多种现有的开源内容解析项目来实现从多种格式的文件中提取元数据和结构化文本,Gora支持把大数据持久化到多种存储实现,Crawler Commons是一个通用的网络爬虫组件。 大数据这个术语最早的引用可追溯到Nutch...
Nutch开发入门 Nutch安装和使用 Nutch二次开发 很不错
nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据
nutch_src 源码 tar—zip格式
eclipse配置nutch,eclipse配置nutch
nutch 搜索模块流程 详细简述nutch搜索详细过程
nutch 源代码的详细分析,对于自己实现自己的搜索引擎很有帮助,尤其是将nutch项目嵌入到 自己的项目 当中很有帮助!
nutch无法下载中文文件的问题 nutch无法下载中文文件的问题
nutch2.x官方的pom文件有问题,这是修改后的
如何通过java程序获得Nutch中网页的详细信息
资源名称:Nutch相关框架视频教程资源目录:【】Nutch相关框架视频教程1_杨尚川【】Nutch相关框架视频教程2_杨尚川【】Nutch相关框架视频教程3_杨尚川【】Nutch相关框架视频教程4_杨尚川【】Nutch相关框架视频教程5_...