nutch分析.docx
《nutch分析.docx》由会员分享,可在线阅读,更多相关《nutch分析.docx(92页珍藏版)》请在冰豆网上搜索。
nutch分析
Nutch分析
1Nutch简介2
1.1nutch体系结构2
2抓取部分3
2.1爬虫的数据结构及含义3
2.2抓取目录分析4
2.3抓取过程概述4
2.4抓取过程分析5
2.4.1inject方法6
2.4.2generate方法12
2.4.3fetch方法14
2.4.4parse方法16
2.4.5update方法16
2.4.6invert方法19
2.4.7index方法23
2.4.8dedup方法26
2.4.9merge方法30
3配置文件分析31
3.1nutch-default.xml分析31
3.1.1
--fileproperties-->31
3.1.2
--HTTPproperties-->32
3.1.3
--FTPproperties-->35
3.1.4
--webdbproperties-->37
3.1.5
--generateproperties-->41
3.1.6
--fetcherproperties-->42
3.1.7
--indexerproperties-->43
3.1.8
--indexingfilterpluginproperties-->45
3.1.9
--analysisproperties-->45
3.1.10
--searcherproperties-->45
3.1.11
--URLnormalizerproperties-->48
3.1.12
--mimeproperties-->48
3.1.13
--pluginproperties-->49
3.1.14
--parserproperties-->49
3.1.15
--urlfilterpluginproperties-->51
3.1.16
--scoringfiltersproperties-->52
3.1.17
--clusteringextensionproperties-->52
3.1.18
--ontologyextensionproperties-->53
3.1.19
--query-basicpluginproperties-->53
3.1.20
--creative-commonspluginproperties-->54
3.1.21
--query-morepluginproperties-->55
3.1.22
--microformats-reltagpluginproperties-->55
3.1.23
--language-identifierpluginproperties-->55
3.1.24
--TemporaryHadoop0.17.xworkaround.-->56
3.1.25
--responsewriterproperties-->56
3.2regex-urlfilter.txt解析58
3.3regex-normalize.xml解析58
3.4总结59
4参考资源59
1Nutch简介
1.1nutch体系结构
2抓取部分
2.1爬虫的数据结构及含义
爬虫系统是由Nutch的爬虫工具驱动的。
并且把构建和维护一些数据结构类型同一系列工具关联起来:
包括webdatabase、一系列的segment和index。
接下来我们将详细描述他们。
三者的物理文件分别存储在爬行结果目录下的crawldb文件夹内,segments文件夹和index文件夹内。
那么三者分别存储的信息是什么呢?
Webdatabase,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,它只在爬虫Crawler工作中使用而和Searcher的工作没有任何关系。
WebDB内存储了两种实体的信息:
page和link。
Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。
Page实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。
同样的,Link实体描述的是两个page实体之间的链接关系。
WebDB构成了一个所抓取网页的链接结构图,这个图中Page实体是图的结点,而Link实体则代表图的边。
一次爬行会产生很多个segment,每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索引。
Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist,然后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已经毫无关系了。
2.2抓取目录分析
抓取后一共生成5个文件夹,分别是:
●crawldb目录存放下载的URL,以及下载的日期,用来页面更新检查时间.
●linkdb目录存放URL的互联关系,是下载完成后分析得到的.
●segments:
存放抓取的页面,下面子目录的个数于获取的页面层数有关系,通常每一层页面会独立存放一个子目录,子目录名称为时间,便于管理.比如我这只抓取了一层页面就只生成了20090508173137目录.每个子目录里又有6个子文件夹如下:
Øcontent:
每个下载页面的内容。
Øcrawl_fetch:
每个下载URL的状态。
Øcrawl_generate:
待下载URL集合。
Øcrawl_parse:
包含来更新crawldb的外部链接库。
Øparse_data:
包含每个URL解析出的外部链接和元数据
Øparse_text:
包含每个解析过的URL的文本内容。
●indexs:
存放每次下载的独立索引目录
●index:
符合Lucene格式的索引目录,是indexs里所有index合并后的完整索引
2.3抓取过程概述
引用到的类主要有以下9个:
1、nutch.crawl.Inject
用来给抓取数据库添加URL的插入器
2、nutch.crawl.Generator
用来生成待下载任务列表的生成器
3、nutch.fetcher.Fetcher
完成抓取特定页面的抓取器
4、nutch.parse.ParseSegment
负责内容提取和对下级URL提取的内容进行解析的解析器
5、nutch.crawl.CrawlDb
负责数据库管理的数据库管理工具
6、nutch.crawl.LinkDb
负责链接管理
7、nutch.indexer.Indexer
负责创建索引的索引器
8、nutch.indexer.DeleteDuplicates
删除重复数据
9、nutch.indexer.IndexMerger
对当前下载内容局部索引和历史索引进行合并的索引合并器
2.4抓取过程分析
Crawler的工作原理主要是:
首先Crawler根据WebDB生成一个待抓取网页的URL集合叫做Fetchlist,接着下载线程Fetcher开始根据Fetchlist将网页抓取回来,如果下载线程有很多个,那么就生成很多个Fetchlist,也就是一个Fetcher对应一个Fetchlist。
然后Crawler根据抓取回来的网页WebDB进行更新,根据更新后的WebDB生成新的Fetchlist,里面是未抓取的或者新发现的URLs,然后下一轮抓取循环重新开始。
这个循环过程可以叫做“产生/抓取/更新”循环。
指向同一个主机上Web资源的URLs通常被分配到同一个Fetchlist中,这样的话防止过多的Fetchers对一个主机同时进行抓取造成主机负担过重。
另外Nutch遵守RobotsExclusionProtocol,网站可以通过自定义Robots.txt控制Crawler的抓取。
在Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的。
这些子操作Nutch都提供了子命令行可以单独进行调用。
下面就是这些子操作的功能描述以及命令行,命令行在括号中。
1.创建一个新的WebDb(admindb-create).
2.将抓取起始URLs写入WebDB中(inject).
3.根据WebDB生成fetchlist并写入相应的segment(generate).
4.根据fetchlist中的URL抓取网页(fetch).
5.根据抓取网页更新WebDb(updatedb).
6.循环进行3-5步直至预先设定的抓取深度。
7.分析链接关系,生成反向链接.(此步1.0特有,具体作用?
)
8.对所抓取的网页进行索引(index).
9.在索引中丢弃有重复内容的网页和重复的URLs(dedup).
10.将segments中的索引进行合并生成用于检索的最终index(merge).
Crawler详细工作流程是:
在创建一个WebDB之后(步骤1),“产生/抓取/更新”循环(步骤3-6)根据一些种子URLs开始启动。
当这个循环彻底结束,Crawler根据抓取中生成的segments创建索引(步骤8-10)。
在进行重复URLs清除(步骤9)之前,每个segment的索引都是独立的(步骤8)。
最终,各个独立的segment索引被合并为一个最终的索引index(步骤10)。
其中有一个细节问题,Dedup操作主要用于清除segment索引中的重复URLs,但是我们知道,在WebDB中是不允许重复的URL存在的,那么为什么这里还要进行清除呢?
原因在于抓取的更新。
比方说一个月之前你抓取过这些网页,一个月后为了更新进行了重新抓取,那么旧的segment在没有删除之前仍然起作用,这个时候就需要在新旧segment之间进行除重。
下边是在Crawl类设置断点调试每个方法的结果.
2.4.1inject方法
描述:
初始化爬取的crawldb,读取URL配置文件,把内容注入爬取数据库.
首先会找到读取URL配置文件的目录urls.如果没创建此目录,nutch1.0下会报错.
得到hadoop处理的临时文件夹:
/tmp/hadoop-Administrator/mapred/
日志信息如下:
2009-05-0815:
41:
36,640INFOInjector-Injector:
starting
2009-05-0815:
41:
37,031INFOInjector-Injector:
crawlDb:
20090508/crawldb
2009-05-0815:
41:
37,781INFOInjector-Injector:
urlDir:
urls
接着设置一些初始化信息.
调用hadoop包JobClient.runJob方法,跟踪进入JobClient下的submitJob方法进行提交整个过程.具体原理又涉及到另一个开源项目hadoop的分析,它包括了复杂的
MapReduce架构,此处不做分析。
查看submitJob方法,首先获得jobid,执行configureCommandLineOptions方法后会在上边的临时文件夹生成一个system文件夹,同时在它下边生成一个job_local_0001文件夹.执行writeSplitsFile后在job_local_0001下生成job.split文件.执行writeXml写入job.xml,然后执行jobSubmitClient.submitJob正式提交整个job流程,日志如下:
2009-05-0815:
41:
36,640INFOInjector-Injector:
starting
2009-05-0815:
41:
37,031INFOInjector-Injector:
crawlDb:
20090508/crawldb
2009-05-0815:
41:
37,781INFOInjector-Injector:
urlDir:
urls
2009-05-0815:
52:
41,734INFOInjector-Injector:
Convertinginjectedurlstocrawldbentries.
2009-05-0815:
56:
22,203INFOJvmMetrics-InitializingJVMMetricswithprocessName=JobTracker,sessionId=
2009-05-0816:
08:
20,796WARNJobClient-UseGenericOptionsParserforparsingthearguments.ApplicationsshouldimplementToolforthesame.
2009-05-0816:
08:
20,984WARNJobClient-Nojobjarfileset.Userclassesmaynotbefound.SeeJobConf(Class)orJobConf#setJar(String).
2009-05-0816:
24:
42,593INFOFileInputFormat-Totalinputpathstoprocess:
1
2009-05-0816:
38:
29,437INFOFileInputFormat-Totalinputpathstoprocess:
1
2009-05-0816:
38:
29,546INFOMapTask-numReduceTasks:
1
2009-05-0816:
38:
29,562INFOMapTask-io.sort.mb=100
2009-05-0816:
38:
29,687INFOMapTask-databuffer=79691776/99614720
2009-05-0816:
38:
29,687INFOMapTask-recordbuffer=262144/327680
2009-05-0816:
38:
29,718INFOPluginRepository-Plugins:
lookingin:
D:
\work\workspace\nutch_crawl\bin\plugins
2009-05-0816:
38:
29,921INFOPluginRepository-PluginAuto-activationmode:
[true]
2009-05-0816:
38:
29,921INFOPluginRepository-RegisteredPlugins:
2009-05-0816:
38:
29,921INFOPluginRepository-thenutchcoreextensionpoints(nutch-extensionpoints)
2009-05-0816:
38:
29,921INFOPluginRepository-BasicQueryFilter(query-basic)
2009-05-0816:
38:
29,921INFOPluginRepository-BasicURLNormalizer(urlnormalizer-basic)
2009-05-0816:
38:
29,921INFOPluginRepository-BasicIndexingFilter(index-basic)
2009-05-0816:
38:
29,921INFOPluginRepository-HtmlParsePlug-in(parse-html)
2009-05-0816:
38:
29,921INFOPluginRepository-SiteQueryFilter(query-site)
2009-05-0816:
38:
29,921INFOPluginRepository-BasicSummarizerPlug-in(summary-basic)
2009-05-0816:
38:
29,921INFOPluginRepository-HTTPFramework(lib-http)
2009-05-0816:
38:
29,921INFOPluginRepository-TextParsePlug-in(parse-text)
2009-05-0816:
38:
29,921INFOPluginRepository-Pass-throughURLNormalizer(urlnormalizer-pass)
2009-05-0816:
38:
29,921INFOPluginRepository-RegexURLFilter(urlfilter-regex)
2009-05-0816:
38:
29,921INFOPluginRepository-HttpProtocolPlug-in(protocol-http)
2009-05-0816:
38:
29,921INFOPluginRepository-XMLResponseWriterPlug-in(response-xml)
2009-05-0816:
38:
29,921INFOPluginRepository-RegexURLNormalizer(urlnormalizer-regex)
2009-05-0816:
38:
29,921INFOPluginRepository-OPICScoringPlug-in(scoring-opic)
2009-05-0816:
38:
29,921INFOPluginRepository-CyberNekoHTMLParser(lib-nekohtml)
2009-05-0816:
38:
29,921INFOPluginRepository-AnchorIndexingFilter(index-anchor)
2009-05-0816:
38:
29,921INFOPluginRepository-JavaScriptParser(parse-js)
2009-05-0816:
38:
29,921INFOPluginRepository-URLQueryFilter(query-url)
2009-05-0816:
38:
29,921INFOPluginRepository-RegexURLFilterFramework(lib-regex-filter)
2009-05-0816:
38:
29,921INFOPluginRepository-JSONResponseWriterPlug-in(response-json)
2009-05-0816:
38:
29,921INFOPluginRepository-RegisteredExtension-Points:
2009-05-0816:
38:
29,921INFOPluginRepository-NutchSummarizer(org.apache.nutch.searcher.Summarizer)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchProtocol(org.apache.nutch.protocol.Protocol)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchAnalysis(org.apache.nutch.analysis.NutchAnalyzer)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchFieldFilter(org.apache.nutch.indexer.field.FieldFilter)
2009-05-0816:
38:
29,921INFOPluginRepository-HTMLParseFilter(org.apache.nutch.parse.HtmlParseFilter)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchQueryFilter(org.apache.nutch.searcher.QueryFilter)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchSearchResultsResponseWriter(org.apache.nutch.searcher.response.ResponseWriter)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchURLNormalizer(.URLNormalizer)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchURLFilter(.URLFilter)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchOnlineSearchResultsClusteringPlugin(org.apache.nutch.clustering.OnlineClusterer)
2009-05-0816:
38:
29,921INFOPluginRepository-NutchIndexi