nutch搜索出现word删除空白页页的问题

Nutch搜索引擎的原理介绍_情不知所起,一往而深_新浪博客
Nutch搜索引擎的原理介绍
Nutch&是一个开源Java&实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。
nutch的主要流程
Nutch组成:
爬虫crawler和查询searcher。
Crawler主要用于从网络上抓取网页并为这些网页建立索引。
Searcher主要利用这些索引检索用户的查找关键词来产生查找结果。
两者之间的接口是索引,所以除去索引部分,两者之间的耦合度很低。
Crawler和Searcher两部分尽量分开的目的主要是为了使两部分可以分布式配置在硬件平台上,例如将Crawler和Searcher分别放在两个主机上,这样可以提升性能。
Crawler&的重点在两个方面,Crawler的工作流程和涉及的数据文件的格式和含义。数据文件主要包括三类,分别是web
database(WebDB),一系列的segment加上index,三者的物理文件分别存储在爬行结果目录下的db目录下webdb子文件夹内,segments&文件夹和index文件夹。那么三者分别存储的信息是什么呢?
一次爬行会产生很多个segment,每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索引。Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist(Crawler根据WebDB生成一个待抓取网页的URL集合),然后
Fetcher(下载线程)通过fetchlist中的URLs抓取这些网页并索引,然后将其存入segment。Segment是有时限的,当这些网页被
Crawler重新抓取后,先前抓取产生的segment就作废了。在存储中。Segment文件夹是以产生时间命名的,方便我们删除作废的
segments以节省存储空间。
Index是Crawler抓取的所有网页的索引,它是通过对所有单个segment中的索引进行合并处理所得的。Nutch利用Lucene技术进行索引,所以Lucene中对索引进行操作的接口对Nutch中的index同样有效。但是需要注意的是,Lucene&中的segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。
database,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,它只在爬虫Crawler工作中使用而和Searcher的工作没有
任何关系。WebDB内存储了两种实体的信息:page和link。Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之间的链接关系。
工作步骤:
在Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的。这些子操作Nutch都提供了子命令行可以单独进行调用。下面就是这些子操作的功能描述以及命令行,命令行在括号中。
1.&创建一个新的WebDb(admin
db -create).
2.&将抓取起始URLs写入WebDB中
3.&根据WebDB生成fetchlist并写入相应的segment(generate).
4.&根据fetchlist中的URL抓取网页
5.&根据抓取网页更新WebDb(updatedb).
6.&循环进行3-5步直至预先设定的抓取深度。
7.&根据WebDB得到的网页评分和links更新segments
(updatesegs).
8.&对所抓取的网页进行索引(index).
9.&在索引中丢弃有重复内容的网页和重复的URLs
10.&将segments中的索引进行合并生成用于检索的最终index(merge).
在建一个WebDB之后(步骤1),
“产生/抓取/更新”循环(步骤3-6)根据一些种子URLs开始启动。当这个循环彻底结束,Crawler根据抓取中生成的segments创建索引
(步骤7-10)。在进行重复URLs清除(步骤9)之前,每个segment的索引都是独立的(步骤8)。最终,各个独立的segment索引被合并为
一个最终的索引index(步骤10)。
其中有一个细节问题,Dedup操作主要用于清除segment索引中的重复URLs,但是我们知道,在WebDB&中是不允许重复的URL存在的,那么为什么这里还要进行清除呢?原因在于抓取的更新。比方说一个月之前你抓取过这些网页,一个月后为了更新进行了重新抓取,那么旧的segment在没有删除之前仍然起作用,这个时候就需要在新旧segment之间进行除重。
关于Nutch和Lucene的使用
Nutch是基于Lucene的。Lucene为Nutch提供了文本索引和搜索的API。
一个常见的问题是:我应该使用Lucene还是Nutch?最简单的回答是:如果你不需要抓取数据的话,应该使用Lucene。常见的应用场合是:你有数据源,需要为这些数据提供一个搜索页面。在这种情况下,最好的方式是直接从数据库中取出数据并用Lucene
API&建立索引。在你没有本地数据源,或者数据源非常分散的情况下,应该使用Nutch。
在分析了Crawler工作中设计的文件之后,接下来我们研究Crawler的抓取流程以及这些文件在抓取中扮演的角色。
Crawler的工作原理:首先
Crawler根据WebDB生成一个待抓取网页的URL集合
叫做Fetchlist,接着
Fetcher&根据Fetchlist将网页抓取回来,如果下载线程有很多个,那么就生成很多个Fetchlist,也就是一个Fetcher对应一个
Fetchlist。然后Crawler用抓取回来的网页更新WebDB,根据更新后的WebDB生成新的Fetchlist,里面是未抓取的或者新发现
的URLs,然后下一轮抓取循环重新开始。这个循环过程可以叫做“产生/抓取/更新”循环。
指向同一个主机上Web资源的URLs通常被分配到同一个Fetchlist中,这可防止过多的Fetchers对
一个主机同时进行抓取造成主机负担过重。另外Nutch遵守Robots Exclusion
Protocol,网站可以通过自定义Robots.txt控制Crawler的抓取。
在nutch爬虫运行后在webdb文件夹下一共产生如下五个文件:&linksByMD5
linksByURL&&
pagesByMD5 & pagesByURL
&&&Stats文件用来存放爬虫爬行后的版本信息,处理网页数量,连接数量;
pagesByURL
等其余四个文件夹下均有两个文件――index和data,其中data文件用来存放有序的key/value对,排序是通过选择不&同的key和comparator来改变的,当然里面会有一些其他信息,&比如在pagesByURL中,就每隔一定长度的key/value对放入一个用来定位的信息(syn);index文件用来存放索引,但是这个索引文件&也是一个有序的,这个里面存放的是key和位置信息,但是在data文件中出现的key在这个index中都能找到的,它为了节省空间,实施了每隔一段key/value建立一条索引,这样在查找的时候,因为是有序的,所以采用2分查找,如果找不到,则返回最后时候的最小的位置信息,这个位置离我们要找&的目标是相当近的,然后在data文件的这个位置向前找就可以很快找到了.
&&&nutch维持这个webdb的方式是,在填加,删除网页或者连接时,并不是直接向这个webdb中填加网页或者连接,而是在WebDBWriter&中的内部类PageInstructionWriter或者LinkInstructionWriter中填加一条对网页操作的命令,然后最后对存放的命&令进行排序去重,最后将这个命令与现有的webdb中存放的网页数据进行合并;Fetcher类是进行实际网页抓取时候运行的类,爬虫产生的文件或文件夹都是由这个类产生的,Nutch提供了选项―是否对抓回的网页进行parse(解析),如果这个选项设置为false,将没有parseddata和parsedtext这两个文件夹。
segments文件分析
&&&nutch爬虫产生的文件几乎都是key/value对,不同的只是key/value的种类和值不同,爬虫运行后在segments文件夹的子文件夹产生如下几个文件夹:
&&&content&
fetchlist&index&
parse_data& parse_text
其中content文件夹存放的内容对应protocol包中的content类;
fetcher文件夹存放的内容对应的是fetcher包中的FetcherOutput类;
fetchlist对应pagedb包总的fetchlist类;
parse_data和parse_text分别对应
parse包中的ParseData和ParseText类
Lucene&中的segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中&各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。
-----------------------------------------------------------------------------------------------------------
Nutch深度抓取的5个步骤细节
/shirdrn/blog/item/16c8d33dfd972d.html
-----------------------------------------------------------------------------------------------------------
Nutch工作流程:建立初始URL集合分析
初始URL集的建立有两种方式:超链接和站长提交。
超链接&是指机器人程序根据网页链到其他网页中的超链接,就像日常生活中所说的“一传十,十传百……”一样,从少数几个网页开始,连到数据库上所有到其他网页的链接。理论上,若网页上有适当的超连结,机器人便可以遍历绝大部分网页。
站长提交&是指在实际运行中,爬虫不可能抓取到所有站点,为此,网站站长可以向搜索引擎进行提交,要求收录,搜索引擎经过核查之后,便将该网站加入到URL集合中,进行抓取。
Nutch工作流程:inject操作分析
inject操作调用的是nutch的核心包之一crawl包中的类org.apache.nutch.crawl.Injector。它执行的结果是:crawldb数据库内容得到更新,包括URL及其状态。
inject操作主要作用可以从下面3方面来说明:
(1)&将URL集合进行格式化和过滤,消除其中的非法URL,并设定URL状态(UNFETCHED),按照一定方法进行初始化分值;
(2)&将URL进行合并,消除重复的URL入口;
(3)&将URL及其状态、分值存入crawldb数据库,与原数据库中重复的则删除旧的,更换新的。
Nutch工作流程:generate操作分析
generate操作调用的是crawl包中的类org.apache.nutch.crawl.Generator。它执行的结果是:创建了抓取&列表,存放于segments目录下,以时间为文件夹名称。循环抓取多少次,segments文件夹下就会有多少个以时间为名称的文件夹。
generate操作主要作用可以从下面3方面来说明:
(1)&从crawldb数据库中将URL取出并进行过滤;
(2)&对URL进行排序,通过域名、链接数和一种hash算法综合进行降序排列;
(3)&将排列列表写入segments目录中。
Nutch工作流程:fetch操作分析
fetch操作调用的是fetcher包中的类org.apache.nutch.fetcher.Fetcher。它执行的结果是:将页面内容抓取下来,存于segment目录下。
fetch操作主要作用可以从下面4方面来说明:
(1)&执行抓取,按照segments目录下的抓取列表进行;
(2)&抓取过程中,页面的URL地址可能因为链接发生改变,从而需要更新URL地址;
(3)&抓取采用多线程方式进行,以提高抓取速度;
(4)fetch操作过程中调用了parse操作。
Nutch工作流程:parse操作分析
parse操作调用的是parse包中的类org.apache.nutch.parse.ParseSegment。它执行的结果是:将fetch得到的页面解析为text和data,存于segments目录下。
parse操作主要作用可以从下面3方面来说明:
(1)&解析segment中由fetch得到的页面,并进行整理,将页面分成为parse-date和parse-text;
(2)parse-date中保存的是页面的题名、作者、日期、链接等内容;
(3)parse-text中保存的是页面的文本内容。
Nutch工作流程:updatedb操作分析
updatedb操作调用的是crawl包中的类org.apache.nutch.crawl.CrawlDb。它执行的结果是:更新了crawldb数据库,为下一轮抓取做准备。
updatedb操作主要作用如下:
根据segments目录下fetch目录和parse目录中的内容,对crawldb进行更新,增加新的URL,更换旧的URL。
进一步的两个处理流程---------------------------
Nutch工作流程:index过程分析
index过程,即索引过程,包括:将数据转换成文本、分析文本、将分析过的文本保存到数据库中这三个操作。
(1)&转换成文本
在索引数据之前,首先必须将数据转换成nutch&能够处理的格式――纯文本字符流。但是,在现实世界中,信息多以富媒体(richmedia)文档格式呈现:PDF、WORD、EXCEL、HTML、XML等。为此,nutch采用了插件机制(plugin),通过各种各样的文档解&析器,将富媒体转换成纯文字字符流。文档解析器种类繁多,开发人员可以根据需要进行选择,同时还可以自己修改或编写,非常灵活方便。
(2)&分析文本
在对数据进行索引前,还需要进行预处理,对数据进行分析使之更加适合被索引。分析数据时,先将文本数据切分成一些大块或者语汇单元(tokens),然后对它们执行一些可选的操作,例如:在索引之前将这些语汇单元转换成小写,使得搜索对大小写不敏感;最有代表性的是要从输入中去掉一&些使用很频繁但却没有实际意义的词,比如英文文本中的一些停止词(a、an、the、in、on等)。同样的,我们也需要分析输入的语汇单元,以便从词语&中去掉一些不必要的字母以找到它们的词干。这一处理过程称为分析(analyze)。分析技术在索引和搜索时都会用到,比较重要。
(3)&将分析过的文本保存到数据库中
对输入的数据分析处理完成之后,就可以将结果写入到索引文件中。Nutch采用的是Lucene的索引格式,可以参考关于Lucene的索引机制。Lucene采用“倒排索引”的数据结果来存储索引的。
Nutch工作流程:搜索程序分析
Nutch的搜索程序执行过程,可以从下面的步骤了解:
(1)HTTP服务器接收用户发送过来的请求。对应到nutch的运行代码中就是一个servlet,称为查询处理器(QueryHandler)。查询处理器负责响应用户的请求,并将相应的HTML结果页面返回给用户。
(2)&查询处理器对查询语句做一些微小的处理并将搜索的项(terms)转发到一组运行索引搜索器的机器上。Nutch的查询系统似乎比lucene简单的多,&这主要是因为搜索引擎的用户对他自己所要执行的查询内容有非常清晰的思路。然而,lucene的系统结构非常灵活,且提供了多种不同的查询方式。看似简单&的nutch查询最终被转换为特定的lucene查询类型。每个索引搜索器并行工作且返回一组有序的文档ID列表。
(3)&现在存在这大量从查询处理器返回过来的搜索结果数据流。查询处理器对这些结果集进行比较,从所有的结果查找出匹配最好的那些。如果其中任何一个索引搜索器在1~2秒之后返回结果失败,该搜索器的结果将被忽略。因此,最后列表由操作成功的搜索器返回的结果组成。
情不知所起,一往而深
博客等级:
博客积分:0
博客访问:13,015
关注人气:0
荣誉徽章:nutch研究—遇到的错误和解决办法(转)
运行 bin/nutch crawl urls -dir crawled -depth 3 -topN 50
&&crawl.log
    出现下面问题:bin/nutch:
line 251: exec: C:\Program: not found。
解决:从新完整的安装cygwin,不要按照网上说的只安装其中需要的那几个包内容。
2、右上角选项卡乱码问题
右上角“简介”、“常见问题”在搜索主界面不乱吗,但搜索时乱码的问题。
修改 Tomcat 7.0/webapps/nutch-1.2/zh/header.html 的编码为GBK
&?xml version="1.0"
encoding="GBK"?&
注意:在&?xml
version="1.0"
encoding="GBK"?&后在添加&META
http-equiv="Content-Type" content="text/
charset=UTF-8"&
3、(参考这篇文章)
按照这篇文章修改源码的时候会出现以下错误:
LinkDb: finished at
11:34:06, elapsed: 00:00:03
Indexer: starting at
Exception in thread "main" java.io.IOException: Job failed!
org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1252)
org.apache.nutch.indexer.Indexer.index(Indexer.java:76)at
org.apache.nutch.crawl.Crawl.main(Crawl.java:167)
解决:这是在爬取网络数据的时候,可能是忘记把IKAnalyzer3.2.8.jar放到nutch/lib目录下了。
4、修改源码后,在此搜索会出现空白页问题(这个花费我三天时间啊)出现的错误是:Caused
by: java.lang.IllegalArgumentException: This AttributeSource does
not have the attribute
'org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute'.
org.apache.lucene.util.AttributeSource.getAttribute(AttributeSource.java:277)
org.apache.nutch.summary.basic.BasicSummarizer.getTokens(BasicSummarizer.java:362)
org.apache.nutch.summary.basic.BasicSummarizer.getSummary(BasicSummarizer.java:134)
出现原因是:
前面我们修改过NutchDocumentAnalyzer类,使用了IKAnalyezer类。此时就需要修改中文分词的开源IKAnalyezer的源码了。
而在IKAnalyezer中并没有添加
PositionIncrementAttribute属性,所以出现异常,于是修改IKAnalyezer的源代码IKTokenizer.java文件在添加
//引入包的地方
org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribu
//变量声明的地方
private PositionIncrementAttribute posIncrA
//public IKTokenizer(Reader in , boolean
isMaxWordLength)方法内添加
posIncrAtt =
addAttribute(PositionIncrementAttribute.class);
用ant命令重新编译IKAnaalyezer,生成IKAnalyzer3.2.8.jar(此时好像需要自己写ant的build.xml文件,我用eclipse直接导出jar文件的)
替换nutch下的对应文件,重新编译nutch。
5、第四步解决之后,还是空白页(这个花费我三天时间啊)
查看tomcat下的log文件时,会有以下异常信息:
ava.lang.IllegalArgumentException: This
AttributeSource does not have the attribute
'org.apache.lucene.analysis.tokenattributes.TypeAttribute'.
org.apache.lucene.util.AttributeSource.getAttribute(AttributeSource.java:277)
org.apache.nutch.summary.basic.BasicSummarizer.getTokens(BasicSummarizer.java:364)
org.apache.nutch.summary.basic.BasicSummarizer.getSummary(BasicSummarizer.java:135)
org.apache.nutch.searcher.FetchedSegments.getSummary(FetchedSegments.java:263)
org.apache.nutch.searcher.FetchedSegments$SummaryTask.call(FetchedSegments.java:63)
org.apache.nutch.searcher.FetchedSegments$SummaryTask.call(FetchedSegments.java:53)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
java.util.concurrent.FutureTask.run(FutureTask.java:138)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:662)
问题出现的原因和问题4类似。需要的同样的地方添加:
private TypeAttribute
addAttribute(TypeAttribute.class);
然后还是从新编译生成IKAnalyzer3.2.8.jar文件,
最后从新ant,生成nutch-1.2.job,nutch-1.2.war,nutch-1.2.jar。把爬去数据和搜索部分的都替换成最新的文件,别忘记IKAnalyzer3.2.8.jar哦。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Nutch1.2搜索引擎使用详解 - 软酷快讯
Nutch1.2搜索引擎使用详解
作者:贾世雄
Nutch作为一款刚刚诞生的开源Web搜索引擎,提供了除商业搜索引擎外的一种新的选择。个人、企业都可通过Nutch来构建适合于自身需要的搜索引擎平台,提供适合于自身的搜索服务,而不必完全被动接收商业搜索引擎的各种约束。
Nutch 是基于Lucene的。Lucene为 Nutch 提供了文本索引和搜索的API。如果你不需要抓取数据的话,应该使用Lucene。常见的应用场合是:你有数据源,需要为这些数据提供一个搜索页面。在这种情况下,最好的方式是直接从数据库中取出数据并用Lucene API建立索引。Nutch 适用于你无法直接获取数据库中的数据网站,或者比较分散的数据源的情况下使用。
Nutch的工作流程可以分为两个大的部分:抓取部分与搜索部分。抓取程序抓取页面并把抓取回来的数据进行反向索引,搜索程序则对反向索引进行搜索回答用户的请求,索引是联系这两者的纽带。下图是对Nutch整个工作流程的描述。
首先需要建立一个空的URL数据库,并且把起始根urls添加到URL数据库中(步骤1),依据URL数据库在新创建的segment中生成fetchlist,存放了待爬行的URLs(步骤2),根据fetchlist从Internet进行相关网页内容的爬行抓取与下载(步骤3),随后把这些抓取到的内容解析成文本与数据(步骤4),从中提取出新的网页链接URL,并对UR数据库进行更新(步骤5),重复步骤2-5直到达到被指定的爬行抓取深度。以上过程构成了Nutch的整个抓取过程,可以用一个循环来对其进行描述:生成→抓取→更新→循环。
当抓取过程完成后,对抓取到的网页进行反向索引,对重复的内容与URL进行剔除,然后对多个索引进行合并,为搜索建立统一的索引库,而后用户可通过由Tomcat容器提供的Nutch用户界面提交搜索请求,然后由Lucene对索引库进行查询,并返回搜索结果给用户,完成整个搜索过程。
一、爬行企业内部网
爬行企业内部网(Intranet Crawling)这种方式适合于针对一小撮Web服务器,并且网页数在百万以内的情况。它使用crawl命令进行网络爬行抓取。在进行爬行前,需要对Nutch进行一系列的配置,过程如下:
1、数据抓取:需要创建一个目录,并且在此目录中创建包含起始根URLs的文件。我们以爬行搜狐网站()为例进行讲述。
创建url文件列表
创建urls文件夹并打开urls文件夹,并在内部建立urls.txt文件,其内容为:/。
依据爬行网站的实际情况,可继续在此文件末尾添加其他URL或者在URL目录里添加其他包含URL的文件。
修改conf/crawl-urlfilter.txt文件
文件conf/crawl-urlfilter.txt主要用于限定爬行的URL形式,其中URL的形式使用正则表达式进行描述。将文中MY.DOMAIN.NAME部分替换为准备爬行的域名,并去掉前面的注释。因此在本文中进行域名替换后的形式为:
+^http://([a-z0-9]*\.)*/
该配置文件还能设置更多相关信息,比如如下,设定那些文件不被抓取
# skip image and other suffixes we can't yet parse -\.(gif|GIF|jpg|JPG|png|PNG|ico|ICO|css|sit|eps|wmf|zip|ppt|mpg|xls|gz|rpm|tgz|mov|MOV|exe|jpeg|JPEG|bmp|BMP|rar|RAR|js|JS)$
修改文件conf/nutch-site.xml
//这个地方每次抓取前一定要修改,否则就会出现抓不到的现象
& ?xml version="1.0"?&
& ?xml-stylesheet type="text/xsl" href="configuration.xsl"?&
& configuration&
& property&
& name&http.agent.name& /name&
& value&& /value&
& description&& /description&
& /property&
&property&
&name&http.agent.description&/name&
&value&&/value&
&description&&/description&
&/property&
&property&
&name&http.agent.url&/name&
&value&&/value&
&description&&/description&
&/property&
&property&
&name&http.agent.email&/name&
&value&&/value&
&description&&/description&
&/property&
& /configuration&
开始爬行抓取
完成对Nutch的配置后,运行crawal命令进行爬行。
#bin/nutch crawl urls -dir crawl -depth 5 -threads 4 -topN 1000
其中命令行中各参数项含义分别为:
dir指定爬行结果的存放目录,此处dir为
depth指定从根URL起将要爬行的深度,此例depth设定为5;
N设定每一层爬行靠前的N个URL,此例N值设定为1000。
另外,crawl还有一个参数项:threads,它设定并行爬行的进程数。在爬行过程中,可通过Nutch日志文件查看爬行的进展状态,爬行完成后结果存放在logs目录里,可在最后加上
&& logs/crawl.log
bin/nutch crawl urls -dir crawl -depth 2 -threads 4 -topN 1000 &&logs/crawl.log
执行完成后,生成的目录:
crawdb,linkdb 是web link目录,存放url 及url的互联关系,作为爬行与重新爬行的依据,页面默认30天过期。
segments 是主目录,存放抓回来的网页。页面内容有bytes[]的raw content 和 parsed text的形式。nutch以广度优先的原则来爬行,因此每爬完一轮会生成一个segment目录。
index 是lucene的索引目录,是indexs里所有index合并后的完整索引,注意索引文件只对页面内容进行索引,没有进行存储,因此查询时要去访问segments目录才能获得页面内容。
可以执行 bin/nutch readdb crawl/crawldb/ -stats查看抓取信息。
可以执行bin/nutch org.apache.nutch.searcher.NutchBean 字符串 做简单的测试。
2、项目部署:把nutch-1.2文件夹下的nutch-1.2.war拷到tomcat的webapps文件下打开tomcat,nutch-1.2.war会自动被解压成同名的nutch-1.2文件夹。
配置nutch-1.2/WEB-INF/classes/nutch-site.xml
修改后如下:
&configuration&
&property&
&name&searcher.dir&/name&
&value&E:\cygwin\nutch-1.2\crawl&/value&
&/property&
&/configuration&
注:E:\cygwin\nutch-1.2\crawl这个路径就是你之前抓取数据的存放路径。
中文乱码问题
配置tomcat的conf文件夹下的server.xml。
修改如下:
&Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"
useBodyEncodingForURI="true"/&
修改页面元素,屏蔽中文乱码
另外:在webapps\nutch\zh\include 下面新建header.jsp,内容就是复制header.html,但是前面加上:
&%@ page contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
同时在webapps\nutch\search.jsp里面,找到并修改为:
String pathl= language + “/include/header.jsp";
System.out.println(pathl);
&jsp:include page="&%= pathl %&"/&
3、抓取目录分析
一共生成5个文件夹,分别是:
Crawldb:存放下载的URL,以及下载的日期,用来页面更新检查时间。
Linkdb:存放URL的互联关系,是下载完成后分析得到的。
Segments:存放抓取的页面,下面子目录的个数于获取的页面层数有关系,通常每一层页
面会独立存放一个子目录,子目录名称为时间,便于管理.没抓取一层页面就会生成一个目录,如15(按时间缩写的),.每个子目录里又有6个子文件夹如下:
content:每个下载页面的内容。
crawl_fetch:每个下载URL的状态。
crawl_generate:待下载URL集合。
crawl_parse:包含来更新crawldb的外部链接库。
parse_data:包含每个URL解析出的外部链接和元数据。
parse_text:包含每个解析过的URL的文本内容。
indexs:存放每次下载的独立索引目录。
index:是lucene的索引目录,是indexes目录里所有index合并后的完整索引,注意索引文件只对页面内容进行索引,没有进行存储,因此查询时要去访问segments目录才能获得页面内容。
二、 爬行整个互联网
爬行整个互联网(Whole-web crawling)是一种大规模网络爬行,与第一种爬行方式相对,具有更强的控制性,使用inject、generate、fetch、updatedb等比较低层次的命令,爬行量大,可能需要数台机器数周才能完成。
1、名词解释:
web 数据库: nutch所知道的page,以及在这些page里头的links (由injector通过DMOZ往里添加page,Dmoz(The Open Directory Project/ODP)是一个人工编辑管理的目录集合,为搜索引擎提供结果或数据。) WebDB存储的内容有(url、对内容的MD5摘要、Outlinks ,page的link数目、抓取信息,可决定是否重新抓取,Page的score,决定页面的重要性)
段(segment)集合:是指page的一个集合,对它进行抓取与索引都作为同一个单元对待。它包含以下类型:
Fetchlist 这些page的名称的集合
Fetcher output: 这些page文件的集合
lucene格式的索引输出
2、抓取数据,建立web database与segments
首先,需要下载一个包含海量URL的文件。下载完成后,将其拷贝到Nutch主目录,并且解压缩文件。
Linux下下载并解压:
content.rdf.u8包含了约三百万个URL,在此仅随机抽取五万分之一的URL进行爬行。同第一种方法一样,首先需要建立包含起始根URL的文件及其父目录。
#mkdir urls
#bin/nutch org.apache.nutch.tools.DmozParser content.rdf.u8 -subset 50000 & urls/urllist
采用Nutch的inject命令将这些URL添加crawldb中。这里,目录crawl是爬行数据存储的根目录。
#bin/nutch inject crawl/crawldb urls
然后,编辑文件conf/nutch-site.xml,内容及方法与“爬行企业内部网”类似,此处略过。接着,开始爬行抓取。可以将整个爬行抓取的命令写成一个shell脚本,每次抓取只需执行此脚本即可,即生成→抓取→更新的过程。根据需要可反复运行此脚本进行爬行抓取。脚本范例及相应的说明如下:
最后,进行索引。爬行抓取完后,需要对抓取回来的内容进行索引,以供搜索查询。过程如下:
#bin/nutch invertlinks crawl/linkdb crawl/segments/* //倒置所有链接
#bin/nutch index crawl/indexes crawl/crawldb crawl/linkdb crawl/segments/*
3、数据部署与查询:索引建立之后,便可以按照单网抓取的方式进行部署和查询了,其过程在此就不在一一介绍了。
请致电800-830-9336或发送与我们联系。}

我要回帖

更多关于 word删除空白页 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信