http://liyanblog.cn/李岩的博客 李岩 java lucene 搜索 nosql hadoop 博客 mongodb, 爬虫2024-03-19T13:38:08+08:00李岩的博客转:各大搜索引擎蜘蛛的UserAgent savagertnullhttp://liyanblog.cn/articles/2013/07/09/1373338741142.html2013-07-09T10:59:01+08:00<p>GOOGLE <br />--------------------------------------------------------------------- <br />66.249.70.212 - - [11/Jan/2009:00:03:35 -0700] "GET www.vidun.com/user-f2fc990265c712c49d51a18a32b39f0c.html?umid=f2fc990265c712c49d51a18a32b39f0c HTTP/1.1" 200 8148 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" <br />Referer: "" <br />UserAgent: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" <br /><br />66.249.70.212 - - [11/Jan/2009:03:27:23 -0700] "GET www.youxigao.com/images/pink/demo.gif HTTP/1.1" 200 2367 "-" "Googlebot-Image/1.0" <br />Referer: "" <br />UserAgent: "Googlebot-Image/1.0" <br /><br />209.85.238.7 - - [11/Jan/2009:00:02:58 -0700] "GET www.youxigao.com/rss/c/1009 HTTP/1.1" 404 37 "-" "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 10 subscribers; feed-id=8474979256887526569)" <br />Referer: "" <br />UserAgent: "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 10 subscribers; feed-id=8474979256887526569)" <br /><br /><br />百度 <br />--------------------------------------------------------------------- <br />60.28.22.38 - - [11/Jan/2009:01:28:09 -0700] "GET www.vidun.com/vwsoft-vwantileechs-download.html?pr=vwantileechs&vi=download HTTP/1.1" 200 27406 "http://www.vidun.com/" "Baiduspider+(+http://www.baidu.com/search/spider.htm)" <br />Referer: "" <br />UserAgent: "Baiduspider+(+http://www.baidu.com/search/spider.htm)" <br /><br /><br />YAHOO <br />--------------------------------------------------------------------- <br />202.160.180.81 - - [11/Jan/2009:00:02:44 -0700] "GET www.vidun.com/ HTTP/1.0" 200 14250 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)" <br />Referer: "" <br />UserAgent: "Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)" <br /><br />67.195.37.167 - - [11/Jan/2009:00:23:00 -0700] "GET www.vidun.com/postmsg-tech-2-120.html?type=tech&id=2&tid=120 HTTP/1.0" 200 12609 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)" <br />Referer: "" <br />UserAgent: "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)" <br /><br /><br />有道 <br />--------------------------------------------------------------------- <br />2008-03-04 09:54:12 W3SVC226223753 222.33.192.54 GET /index.php - 80 - 61.135.219.7 Mozilla/5.0+(compatible;+YodaoBot/1.0;+http://www.yodao.com/help/webmaster/spider/;+) - 200 0 0 <br />Referer: "" <br />UserAgent: "Mozilla/5.0 (compatible; YodaoBot/1.0; http://www.yodao.com/help/webmaster/spider/; )" <br /><br /><br />61.135.249.120 - - [11/Jan/2009:09:44:46 -0700] "GET vidun.com/robots.txt HTTP/1.1" 404 - "-" "Mozilla/5.0 (compatible; YodaoBot/1.0; http://www.yodao.com/help/webmaster/spider/; )" <br />Referer: "" <br />UserAgent: "Mozilla/5.0 (compatible; YodaoBot/1.0; http://www.yodao.com/help/webmaster/spider/; )" <br /><br /><br />SOSO <br />--------------------------------------------------------------------- <br />58.61.164.207 - - [11/Jan/2009:03:13:53 -0700] "GET www.vidun.com/robots.txt HTTP/1.1" 404 - "http://www.vidun.com/robots.txt" "Sosospider+(+http://help.soso.com/webspider.htm)" <br />Referer: "" <br />UserAgent: "Sosospider+(+http://help.soso.com/webspider.htm)" <br /><br />2008-03-04 10:48:28 W3SVC226223753 222.33.192.54 GET /index.php - 80 - 124.115.4.218 Sosoimagespider+(+http://help.soso.com/soso-image-spider.htm) http://www.tatabao.com/ 200 0 0 <br />Referer: "" <br />UserAgent: "Sosoimagespider+(+http://help.soso.com/soso-image-spider.htm)" <br /><br /><br />Sogou <br />--------------------------------------------------------------------- <br />219.234.81.41 - - [11/Jan/2009:03:26:49 -0700] "GET www.vidun.com/ HTTP/1.0" 200 14250 "-" "Sogou Web Sprider(compatible; Mozilla 4.0; MSIE 6.0; Windows NT 5.1; SV1; Avant Browser; InfoPath.1; .NET CLR 2.0.50727; .NET CLR1.1.4322)" <br />Referer: "" <br />UserAgent: "Sogou Web Sprider(compatible; Mozilla 4.0; MSIE 6.0; Windows NT 5.1; SV1; Avant Browser; InfoPath.1; .NET CLR 2.0.50727; .NET CLR1.1.4322)" <br /><br /><br />220.181.61.217 - - [11/Jan/2009:13:10:57 -0700] "GET www.youxigao.com/play/3615?id=3615 HTTP/1.1" 302 5 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)" <br />Referer: "" <br />UserAgent: "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)" <br /><br />220.181.19.74 - - [11/Jan/2009:06:20:37 -0700] "GET www.vidun.com/vwsoft-vwantileechs-download.html?pr=vwantileechs&vi=download HTTP/1.1" 200 27406 "-" "Sogou Orion spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)" <br />Referer: "" <br />UserAgent: "Sogou Orion spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)" <br /><br /><br />220.181.19.78 - - [11/Jan/2009:10:55:18 -0700] "GET www.vidun.com/robots.txt HTTP/1.1" 404 - "http://pic.sogou.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" <br />Referer: "http://pic.sogou.com/" <br />UserAgent: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" <br /><br />219.234.81.27 - - [11/Jan/2009:23:53:41 -0700] "GET www.vidun.com/ HTTP/1.1" 200 14271 "-" "Sogou-Test-Spider/4.0 (compatible; MSIE 5.5; Windows 98)" <br />Referer: "" <br />UserAgent: "Sogou-Test-Spider/4.0 (compatible; MSIE 5.5; Windows 98)" <br /><br />2008-03-04 17:23:59 W3SVC226223753 222.33.192.54 HEAD /index.php - 80 - 220.181.19.107 Sogou+head+spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07) - 200 0 0 <br /><br /></p>转:网络爬虫之网页更新的判断策略savagertnullhttp://liyanblog.cn/articles/2013/03/08/1362728124878.html2013-03-08T15:35:24+08:00<p>摘要:做搜索引擎的时候,网络爬虫(WebSpider)对于有更新的页面才会重新下载。如何判断网页是否更</p>
<p>新就需要采取一定的方法,本文简要的探讨了判断网页跟新的2个策略。</p>
<p>关键字:网页跟新,LastModified,ETag,MD5数字签名</p>
<p> 编写搜索引擎程序的时候,我们需要判断一个网页是否已经更新。有更新的页面就得重新下载再次</p>
<p>建立索引,而没有更新的页面就没必要重新索引,从而节约系统资源。</p>
<p>1、使用HTTP协议头</p>
<p> 通产情况下,下载网页我们使用HTTP协议,向服务器发送HEAD请求,可以得到页面的最后修改时</p>
<p>间LastModifed,或者标签ETag。将这两个变量和上次下载记录的值的比较就可以知道一个网页是否跟新。</p>
<p>这个策略对于静态网页是有效的。但是对于绝大多数动态网页如ASP,JSP来说,LastModifed就是服务器</p>
<p>发送Response的时间,并非网页的最后跟新时间,而Etag通常为空值。所以对于动态网页使用</p>
<p>LastModifed和Etag来判断是不合适的。</p>
<p>2、使用MD5数字签名</p>
<p> 每次下载网页时,把服务器返回的数据流ResponseStream先放在内存缓冲区,然后对</p>
<p>ResponseStream生成MD5数字签名S1,下次下载同样生成签名S2,比较S2和S1,如果相同,则页面没有</p>
<p>跟新,否则网页就有跟新。需要说明的是用md5算法对文本刘签名的速度是极快的,M级的数据可以在毫秒</p>
<p>内完成。这种策略虽然也把页面数据从服务器传输到了本地机,但是省掉了页面的I/O操作,对系统性能的</p>
<p>提升是很有帮助的。</p>java去除网页中的注释savagertnullhttp://liyanblog.cn/articles/2013/01/29/1359434950899.html2013-01-29T12:49:10+08:00<p>/**去除注释<br /> * @param 原始内容<br /> * @return 过滤后内容<br /> */<br /> public static String trimComment(String content) {<br /> String regEx = "<!--[\\s\\S]*?-->";<br /> Pattern p = Pattern.compile(regEx);<br /> Matcher m = p.matcher(content);<br /> String result = content;<br /> if (m.find()) {<br /> result = m.replaceAll("");<br /> }<br /> return result;<br /> }</p>java去除网页中的css style样式savagertnullhttp://liyanblog.cn/articles/2013/01/29/1359434919840.html2013-01-29T12:48:39+08:00<p>抓取下来的网页中有多余信息。如果储存的话浪费大量磁盘空间。预处理去掉</p>
<p>/**去除style<br /> * @param 原始内容<br /> * @return 过滤后内容<br /> */<br /> public static String trimStyle(String content) {<br /> String regEx ="<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";<br /> <br /> Pattern p = Pattern.compile(regEx);<br /> Matcher m = p.matcher(content.toLowerCase());<br /> String result = content;<br /> if (m.find()) {<br /> result = m.replaceAll("");<br /> }<br /> return result;<br /> }</p>java去除网页中的javascriptsavagertnullhttp://liyanblog.cn/articles/2013/01/29/1359434868930.html2013-01-29T12:47:49+08:00<p>抓取下来的网页中有多余信息。如果储存的话浪费大量磁盘空间。预处理去掉</p>
<p>/**去除script<br /> * @param 原始内容<br /> * @return 过滤后内容<br /> */<br /> public static String trimScript(String content) {<br /> String regEx = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>";<br /> <br /> Pattern p = Pattern.compile(regEx);<br /> Matcher m = p.matcher(content.toLowerCase());<br /> String result = content;<br /> if (m.find()) {<br /> result = m.replaceAll("");<br /> }<br /> return result;<br /> }</p>Nutch Crawler工作流程及文件格式详细分析savagertnullhttp://liyanblog.cn/articles/2012/09/25/1348556304764.html2012-09-25T14:58:24+08:00<div class="content-head clearfix">
<h2 class="title content-title">Nutch Crawler工作流程及文件格式详细分析</h2>
</div>
<div id="content" class="content mod-cs-content text-content clearfix">
<p>Crawler和Searcher两部分被尽是分开,其主要目的是为了使两个部分可以布地配置在硬件平台上,例如Crawler和Searcher分别被放置在两个主机上,这样可以极大的提高灵活性和性能。</p>
<p><strong>一、总体介绍</strong><br /><br /> 1、先注入种子urls到crawldb<br /> 2、循环:</p>
<p>[ul][li]generate 从crawldb中生成一个url的子集用于抓取[/li][li]fetch 抓取上一小的url生成一个个segment[/li][li]parse 分析已抓取segment的内容[/li][li]update 把已抓取的数据更新到原先的crawldb[/li][/ul]</p>
<p> 3、从已抓取的segments中分析出link地图<br /> 4、索引segment文本及inlink锚文本</p>
<p><br /><strong>二、相关的数据结构</strong></p>
<p><br />Crawl DB</p>
<p>● CrawlDb 是一个包含如下结构数据的文件:<br /> &lt;URL, CrawlDatum&gt;</p>
<p>● CrawlDatum:<br /> &lt;status, date, interval, failures, linkCount,...&gt;</p>
<p>● Status:<br /> &#123db_unfetched, db_fetched, db_gone,linked,<br /> fetch_success, fetch_fail, fetch_gone&#125<br /> 爬虫Crawler:<br /> Crawler的工作流程包括了整个nutch的所有步骤--injector,generator,fetcher,parseSegment,updateCrawleDB,Invert links, Index ,DeleteDuplicates,IndexMerger<br /> Crawler涉及的数据文件格式和含义,和以上的各个步骤相关的文件分别被存放在物理设备上的以下几个文件夹里,crawldb,segments,indexes,linkdb,index五个文件夹里。<br /> 那么各个步骤和流程是怎么,各个文件夹里又是放着什么呢?观察Crawler类可以知道它的流程。<br /><strong>1</strong><strong>、</strong><strong>Injector injector =new Injector(conf);</strong> <strong><em>//Crawl.java line 104</em></strong><br /> Usage: Injector&lt;crawldb&gt;&lt;url_dir&gt;<br /> 首先是建立起始url集,每个url都经过<strong>URLNormalizers</strong>、<strong>filter</strong>和<strong>scoreFilter</strong>三个过程并标记状态。首先经过normalizerplugin,把url进行标准化,比如basic nomalizer的作用有把大写的url标准化为小写,把空格去除等等。然后再经过的plugin是filter,可以根据你写的正则表达式把想要的url留下来。经过两个步骤后,然后就是把这个url进行状态标记,每个url都对应着一个CrawlDatum,这个类对应着每个url在所有生命周期内的一切状态。细节上还有这个url处理的时间和初始时的分值。<br /> 同时,在这个步骤里,会在文件系统里生成如下文件夹crawlDB\current\part-00000, 这个文件夹里还有.data.crc, .index.crc, data, index四个文件<br />● MapReduce1: 把输入的文件转换成DB格式<br /> In:包含urls的文本文件<br /> Map(line) →&lt;url, CrawlDatum&gt;;status=db_unfetched<br /> Reduce() isidentity;<br /> Output:临时的输出文件夹<br />● MapReduce2: 合并到现有的DB<br /> Input:第一步的输出和已存在的DB文件<br /> Map() isidentity.<br /> Reduce:合并CrawlDatum成一个实体(entry)<br /> Out:一个新的DB<br /><strong>2</strong><strong>、</strong><strong>Generator generator = newGenerator(conf);</strong></p>
<p><strong> </strong>//Generates a subset of a crawl db tofetch<br /> Usage: Generator &lt;crawldb&gt;&lt;segments_dir&gt; [-force] [-topN N][-numFetchers numFetchers] [-adddays numDays] [-noFilter]<br /> 在这个步骤里,Generator一共做了四件事情,<br /> 1、给前面injector完成的输出结果里按分值选出前topN个url,作为一个fetch的子集。<br /> 2、根据第一步的结果检查是否已经选取出一些url,CrawlDatum的实体集。<br /> 3、再次转化,此次要以url的host来分组,并以url的hash来排序。<br /> 4、根据以上的步骤的结果来更新crawldb(injector产生)。<br />● MapReduce1: 根据要求选取一些要抓取的url<br /> In: Crawl DB文件<br /> Map() → ifdate≥now, invert to &lt;CrawlDatum,url&gt;<br /> Partition以随机的hash值来分组<br /> Reduce:<br /> compare() 以CrawlDatum.linkCount的降序排列<br /> output onlytop-N most-linked entries<br />● MapReduce2: 为下一步抓取准备<br /> Map() isinvert; Partition() by host, Reduce() is identity.<br /> Out:包含&lt;url,CrawlDatum&gt; 要并行抓取的文件<br /><strong>3</strong><strong>、</strong><strong>Fetcher fetcher = newFetcher(conf);</strong></p>
<p>//The fetcher. Most of the work is done byplugins<br /> Usage: Fetcher&lt;segment&gt; [-threads n][-noParsing]<br /> 这个步骤里,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)。<br /> 之前讲到根据抓取回来的各种状态,进行再处理,这些状态一共包括12种,比如当抓取成功时,会像上刚讲的那样先存储结果,再判断是否是链接跳转,跳转的次数等等处理。<br /><br />● MapReduce:抓取<br /> In:&lt;url,CrawlDatum&gt;, 以host分区,以hash值排序<br /> Map(url,CrawlDatum) → &lt;url,FetcherOutput&gt;<br /> 多线程的,同步的map实现<br /> 调用已有的协议protocol插件<br /> FetcherOutput: &lt;CrawlDatum,Content&gt;<br /> Reduce isidentity<br /> Out: 两个文件:&lt;url,CrawlDatum&gt;,&lt;url,Content&gt;<br /><strong>4</strong><strong>、</strong><strong>ParseSegment parseSegment= new ParseSegment(conf);</strong></p>
<p>//Parse content in a segment<br /> Usage: ParseSegmentsegment<br />对于这个步骤的逻辑比较简单,只是对抓取后上一步骤存储在segment里的content进行分析parse。同样,这个步骤的具体工作也是由插件来完成的。<br /><br />MapReduce: 分析内容<br /> In:&lt;url, Content&gt; 抓取来的内容<br /> Map(url,Content) → &lt;url, Parse&gt;<br /> 调用分析插件parserplugins<br /> Reduce isidentity.<br /> Parse:&lt;ParseText, ParseData&gt;<br /> Out:分割成三个文件: &lt;url,ParseText&gt;,&lt;url,ParseData&gt;和&lt;url,CrawlDatum&gt; 为了outlinks.<br /><br /><strong>5</strong><strong>、</strong><strong>CrawlDb crawlDbTool = newCrawlDb(conf);</strong></p>
<p>//takes the output of the fetcher and updates the crawldbaccordingly.<br /> Usage: CrawlDb&lt;crawldb&gt; (-dir&lt;segments&gt; |&lt;seg1&gt;&lt;seg2&gt; ...) [-force] [-normalize][-filter] [-noAdditions]<br /> 这个类主要是根据fetcher的输出去更新crawldb。map和reduce分别做了两方面的事情,在map里是对url的nomalizer,和filte,在reduce里是对新抓取进来的页面(CrawlDatum)和原先已经存在的进行合并。<br /><br />MapReduce:合并抓取的和分析后的输出到crawldb里<br /> In:&lt;url,CrawlDatum&gt;现有的db加上抓取后的和分析后的输出<br /> Map() isidentity<br /> Reduce()合并所有实体(entry)成一个,以抓取后的状态覆盖原先的db状态信息,统计出分析后的链接数<br /> Out: 新的crawldb<br /><strong>6.LinkDb linkDbTool = newLinkDb(conf);</strong></p>
<p>//Maintains an inverted link map, listing incoming links foreach url.<br /> Usage: LinkDb&lt;linkdb&gt; (-dir&lt;segmentsDir&gt; |&lt;seg1&gt;&lt;seg2&gt; ...) [-force] [-noNormalize][-noFilter]<br /> 这个类的作用是管理新转化进来的链接映射,并列出每个url的外部链接(incominglinks)。先是对每一个url取出它的outLinks,作map操作把这个url作为每个outLinks的incominglink,在reduce里把根据每个key来把一个url的所有incominglink都加到inlinks里。这样就把每个url的外部链接统计出来了。然后一步是对这些新加进来的链接进行合并。<br />● MapReduce: 统计每个链接的外部链接<br /> In:&lt;url,ParseData&gt;, 包含所有链接的分析后的结果<br /> Map(srcUrl,ParseData&gt; → &lt;destUrl,Inlinks&gt;<br /> 为每个链出链接收集一个入链。<br /> Inlinks:&lt;srcUrl, anchorText&gt;*<br /> Reduce()加上外部入链数量<br /> Out:&lt;url, Inlinks&gt;, 一个相关完整的链接地图<br /><strong>7.Indexer indexer = newIndexer(conf);</strong></p>
<p>//Create indexes for segments<br /> Usage:&lt;index&gt;&lt;crawldb&gt;&lt;linkdb&gt;&lt;segment&gt; ...<br /> 这个类的任务是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是为前面爬虫抓取回来的数据进行索引好让用户可以搜索到这些数据。这里的输入就比较多了,有segments下的fetch_dir,parseData和parseText,还有crawldb下的current_dir和linkdb下的current_dir。在这个类里,map也不做,在reduce时处理。当然要把这些数据体组合成一个lucene的document让它索引了。在reduce里组装好后收集时是&lt;url,doc&gt;,最后在输出的OutputFormat类里进行真正的索引。<br /><br />● MapReduce: 生成lucene的索引文件<br /> In: 外个文件,values 以 &lt;Class, Object&gt;包装<br /> &lt;url, ParseData&gt; from parse, 有title,metadata, 等等信息.<br /> &lt;url, ParseText&gt; from parse, 文本text<br /> &lt;url, Inlinks&gt; from invert,锚文本anchors<br /> &lt;url, CrawlDatum&gt; fromfetch,用于抓取<br /> Map() isidentity<br /> Reduce()生成Lucene Document<br /> 调用index插件<br /> Out:建立Lucene 索引; 最后存储到文件系统上<br /><br /><strong> 8.DeleteDuplicates dedup = new DeleteDuplicates(conf);</strong></p>
<p>//这个类的作用就是它的名字了。<br /> Usage: DeleteDuplicates&lt;indexes&gt; ...<br /> 这个类的作用就是这它的名字所写的意思--去重。前面索引后(当然不是一次时的情况)会有重复,所以要去重。为什么呢,在一次索引时是不重复的,可是多次抓取后就会有重复了。就是这个原因才要去重。当然去重的规则有两种一个是以时间为标准,一种是以内容的md5值为标准。<br /><strong> 9.IndexMerger merger= new IndexMerger(conf);</strong><br /> IndexMerger [-workingdir&lt;workingdir&gt;] outputIndexindexesDir...<br /> 这个类就比较简单了,把所有的小索引合并成一个索引。在这一步没有用到map-reduce。<br /> 在这九大步骤中generator,fetcher,parseSegment,crawlDbTool会根据抓取的层数循环运行,当抓取的层数大于1时会运行linkInvert,index,dedup,和merge。</p>
</div>nutch 命令savagertnullhttp://liyanblog.cn/articles/2012/09/25/1348555749939.html2012-09-25T14:49:09+08:00<div class="content-head clearfix">
<h2 class="title content-title">nutch 命令</h2>
</div>
<div id="content" class="content mod-cs-content text-content clearfix">
<p>关键字: nutch 命令 <br />Nutch采用了一种命令的方式进行工作,其命令可以是对局域网方式的单一命令也可以是对整个Web进行爬取的分步命令。主要的命令如下:</p>
<p>1. Crawl <br />Crawl是“org.apache.nutch.crawl.Crawl”的别称,它是一个完整的爬取和索引过程命令。 <br />使用方法: <br />Shell代码 <br />bin/nutch crawl <urlDir> [-dir d] [-threads n] [-depth i] [-topN]</p>
<p>bin/nutch crawl <urlDir> [-dir d] [-threads n] [-depth i] [-topN]<br />参数说明: <br /> <urlDir>:包括URL列表的文本文件,它是一个已存在的文件夹。 <br /> [-dir <d>]:Nutch保存爬取记录的工作目录,默认情况下值为:./crawl-[date],其中[date]为当前目期。 <br /> [-threads <n>]:Fetcher线程数,覆盖默认配置文件中的fetcher.threads.fetch值(默认为10)。 <br /> [-depth <i>]:Nutch爬虫迭代的深度,默认值为5。 <br /> [-topN <num>]:限制每一次迭代中的前N条记录,默认值为 Integer.MAX_VALUE。</p>
<p>配置文件: <br />hadoop-default.xml <br /> hadoop-site.xml <br /> nutch-default.xml <br /> nutch-site.xml <br /> crawl-tool.xml</p>
<p> 其他文件: <br /> crawl-urlfilter.txt</p>
<p>2. Readdb <br /> Readdb命令是“org.apache.nutch.crawl.CrawlDbReader”的别称,返回或者导出Crawl数据库(crawldb)中的信息。 <br /> 使用方法: <br />Shell代码 <br />bin/nutch rseaddb <crawldb> (-stats | -dump <out_dir> | -url <url>) </p>
<p>bin/nutch rseaddb <crawldb> (-stats | -dump <out_dir> | -url <url>) <br />参数说明: <br /><crawldb>:crawldb目录. <br />[-stats]::在控制台打印所有的统计信息 <br />[-dump <out_dir>]:导出crawldb信息到指定文件夹中的文件 <br />[-url <url>]:打印指定URL的统计信息 <br />实例: <br />Shell代码 <br />$ bin/nutch readdb fullindex/crawldb -stats </p>
<p>$ bin/nutch readdb fullindex/crawldb -stats</p>
<p>CrawlDb statistics start: fullindex/crawldb <br />Statistics for CrawlDb: fullindex/crawldb <br />TOTAL urls: 468030 <br />retry 0: 467361 <br />retry 1: 622 <br />retry 2: 32 <br />retry 3: 15 <br />min score: 0.0 <br />avg score: 0.0034686408 <br />max score: 61.401 <br />status 1 (db_unfetched): 312748 <br />status 2 (db_fetched): 80671 <br />status 3 (db_gone): 69927 <br />status 4 (db_redir_temp): 1497 <br />status 5 (db_redir_perm): 3187 <br />CrawlDb statistics: done <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml</p>
<p>说明: <br />-stats命令是一个快速查看爬取信息的很有用的工作,其输出信息表示了: <br />DB_unfetched:链接到已爬取页面但还没有被爬取的页面数(原因是它们没有通过url过滤器的过滤,或者包括在了TopN之外被Nutch丢弃) <br />DB_gone:表示发生了404错误或者其他一些臆测的错误,这种状态阻止了对其以后的爬取工作。 <br />DB_fetched表示已爬取和索引的页面,如果其值为0,那肯定出错了。</p>
<p>3. readlinkdb <br />它是"org.apache.nutch.crawl.LinkDbReader"的别称,导出链接库中信息或者返回其中一个URL信息。 <br />使用方法: <br />Shell代码 <br />Bin/nutch readlinkdb <linkdb> (-dump <out_dir> | -url <url>) </p>
<p>Bin/nutch readlinkdb <linkdb> (-dump <out_dir> | -url <url>) <br />参数说明: <br /><linkdb>:linkdb工作目录 <br />[-dump <out_dir>]:导出信息到文件夹下 <br />[-url <url>]:打印某个URL的统计信息 <br />实例: <br />Shell代码 <br />$ bin/nutch readlinkdb fullindex/linkdb -url www.ccnu.edu.cn - no link information </p>
<p>$ bin/nutch readlinkdb fullindex/linkdb -url www.ccnu.edu.cn - no link information <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml</p>
<p>4. inject <br />它是"org.apache.nutch.crawl.Injector"的别称,注入新URL到crawldb中。 <br />使用方法: <br />Shell代码 <br />bin/nutch injector <crawldb> <urldir></p>
<p>bin/nutch injector <crawldb> <urldir><br />参数说明: <br /><crawldb>:crawldb文件夹 <br /><urldir>:保存有URL的文件的文件夹目录 <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br /><br />以下配置文件参数影响到了注入方式: <br />db.default.fetch.interval——按天设置爬取间隔,默认值30.0f <br />db.score.injected——设置URL的默认打分,默认值1.0f <br />urlnormalizer.class——规范化URL的类,默认值为 org.apache.nutch.net.BasicUrlNormalizer</p>
<p>5. generate <br />它是“org.apache.nutch.crawl.Generator”,从Crawldb中抓取新的Segment。 <br />使用方法: <br />Shell代码 <br />bin/nutch generator <crawldb> <segments_dir> [-topN <num>] [-numFetchers <fetchers>] [-adddays <days>]</p>
<p>bin/nutch generator <crawldb> <segments_dir> [-topN <num>] [-numFetchers <fetchers>] [-adddays <days>]<br />参数说明: <br /><crawldb>:crawldb目录 <br /><segments_dir>:新建的爬取Segment目录 <br />[-topN <num>]:选取前多少个链接,默认值为Long.MAX_VALUE <br />[-numFetchers <fetchers>]:抓取分区数量。 Default: Configuration key -> mapred.map.tasks -> 1 <br />[-adddays <days>]: 添加 <days>到当前时间,配置crawling urls ,以将很快被爬取db.default.fetch.interval默认值为0。爬取结束时间在当前时间以前的。 <br />示例: <br />Shell代码 <br />bin/nutch generate /my/crawldb /my/segments -topN 100 -adddays 20</p>
<p>bin/nutch generate /my/crawldb /my/segments -topN 100 -adddays 20<br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />说明: <br />generate.max.per.host – 设置单个主机最大的URL数量,默认情况下:unlimited。</p>
<p>6. fetch <br />它是“org.apache.nutch.fetcher.Fetcher”的代称,它负责一个segment的爬取。 <br />使用方法: <br />Shell代码 <br />bin/nutch fetcher <segment> [-threads <n>] [-noParsing]</p>
<p>bin/nutch fetcher <segment> [-threads <n>] [-noParsing]<br />参数说明: <br /><segment>:segment目录 <br />[-threads <n>]:运行的fetcher线程数默认值为 Configuration Key -> fetcher.threads.fetch -> 10 <br />[-noParsing]:禁用自动解析segment数据 <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />说明: <br />Fetcher依赖于多个插件以爬取不同的协议,目前已有的协议及支撑插件如下: <br />http: <br />protocol-http <br />protocol-httpclient <br />https: <br />protocol-httpclient <br />ftp: <br />protocol-ftp <br />file: <br />protocol-file <br />当爬取网上文档的时候,不应该使用protocol-file,因为它是用于爬取本地文件的。如果你想爬取http、https,应当使用protocol-httpclient。 <br />7. parse <br />它是“org.apache.nutch.parse.ParseSegment”的代称,它对一个segment运行ParseSegment。 <br />使用方法: <br />Shell代码 <br />bin/nutch parse <segment></p>
<p>bin/nutch parse <segment><br />参数说明: <br /><segment>:Segment文件夹 <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />说明: <br />它依赖于多个插件来解析不同格式的内容,支持的格式及插件有: <br />内容格式 插件 备注 <br />text/html parse-html 使用NekoHTML 或者TagSoup解析HTML <br />application/x-javascript parse-js 解析JavaScript 文档(.js). <br />audio/mpeg parse-mp3 解析MP3 Audio文档(.mp3). <br />application/vnd.ms-excel parse-msexcel 解析MSExcel文档 (.xls). <br />application/vnd.ms-powerpoint parse-mspowerpoint 解析MSPower!Point 文档 <br />application/msword parse-msword 解析MSWord文档 <br />application/rss+xml parse-rss 解析RSS文档(.rss) <br />application/rtf parse-rtf 解析RTF文档(.rtf) <br />application/pdf parse-pdf 解析PDF文档 <br />application/x-shockwave-flash parse-swf 解析Flash 文档 (.swf) <br />text-plain parse-text 解析Text文档(.txt) <br />application/zip parse-zip 解析Zip文档(.zip) <br />other types parse-ext 通过基于content-type或者路径前缀的外部命令来解析文档 <br />默认情况下只有txt、HTML、JS格式的插件可用,其他的需要在nutch-site.xml中配置使用。 <br />8 . segread <br />"segread" 是"org.apache.nutch.segment.SegmentReader"的代称,它读取并导出Segment数据。 <br />使用方法: <br />Shell代码 <br />bin/nutch segread <segment></p>
<p>bin/nutch segread <segment><br />参数说明: <br /><segment>:Segment文件夹 <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />说明: <br />在Nutch0.9后的版本中改为了readseg <br />9 . updatedb <br />它是“org.apache.nutch.crawl.CrawlDb”的代称,用fetch过程中获取的信息更新crawldb。 <br />使用方法: <br />Shell代码 <br />bin/nutch updatedb <crawldb> <segment> [-noadditions]</p>
<p>bin/nutch updatedb <crawldb> <segment> [-noadditions]<br />参数说明: <br /><crawldb>:crawldb目录 <br /><segment>:已经爬取的segment目录 <br />[-noadditions]:是否添加新的链接到crawldb中 <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml</p>
<p>10. invertlinks <br />它是“org.apache.nutch.crawl.LinkDb”的代称,它用从segment中获取到的信息更新linkdb。 <br />使用方法: <br />Shell代码 <br />bin/nutch invertlinks <linkdb> (-dir segmentsDir | segment1 segment2 ...)</p>
<p>bin/nutch invertlinks <linkdb> (-dir segmentsDir | segment1 segment2 ...)</p>
<p>参数说明: <br /><linkdb>: linkdb目录 <br /><segment>: segment目录,可以指定至少一个的文件夹</p>
<p>配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />11. index <br />它是“org.apache.nutch.indexer.Indexer”的代称,创建一个segment的索引,利用crawldb和linkdb中的数据对索引中的页面打分。 <br />使用方法: <br />Shell代码 <br />bin/nutch index <index> <crawldb> <linkdb> <segment> ...</p>
<p>bin/nutch index <index> <crawldb> <linkdb> <segment> ...<br />参数说明: <br /><index>: 索引创建后的保存目录 <br /><crawldb>: crawldb目录 <br /><linkdb>: linkdb目录 <br /><segment>: segment目录,可以指定多个 <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml</p>
<p>12. merge <br />Merge是“org.apache.nutch.indexer.IndexMerger”的代称,它合并多个segment索引。 <br />使用方法: <br />bin/nutch merge [-workingdir <workingdir>] <outputIndex> <indexesDir> ...</p>
<p>参数说明: <br />[-workingdir <workingdir>]:提定工作目录 <br /><outputIndex>:合并后的索引存储目录 <br /><indexesDir>:包含待合并的索引目录,可以指定多个</p>
<p>配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />13. mergedb <br />它是“org.apache.nutch.crawl.CrawlDbMerger”的代称,合并多个CrawlDb,URLFilter可选择性地过滤指定内容。 <br />可以合并多个DB到一个中。当你分别运行爬虫并希望最终合并DB时,它会相当有用。可选择地,可以运行当前URLFilter过滤数据库中的URL,以滤去不需要的URL。当只有一个DB时也很有用,它意味着你可以通过这个工作去滤掉那些DB中你不想要的URL。 <br />只用这个工具来过滤也是可能的,在这种情况下,只指定一个crawldb。 <br />如果同一个URL包括在多个CrawlDb中,只有最近版本的才会被保留,即由org.apache.nutch.crawl.CrawlDatum.getFetchTime()值决定的。然而,所有版本的元数据被聚合起来,新的值代替先前的值。 <br />使用方法: <br />bin/nutch merge output_crawldb crawldb1 [crawldb2 crawldb3 ...] [-filter] <br />参数说明: <br />output_crawldb:CrawlDb输出文件夹 <br />crawldb1 [crawldb2 crawldb3 ...]:一个或者多个CrawlDb(s). <br />-filter:采用的URLFilters <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml</p>
<p>14. mergelinkdb <br />它是“org.apache.nutch.crawl.LinkDbMerger”的代称,用于合并多个linkdb,可以选择性的使用URLFilter来过滤指定内容。 <br />当分别从多个segment群中分布式建立LinkDb而又需要合并为一个时很有用。或者,也可以指定单个LinkDb,只是用它来过滤URL。 <br />只用这个工具来过滤也是可能的,在这种情况下,只指定一个LinkDb。 <br />如果一个URL包含在多个LinkDb中,所有的内部链接被聚合,但是最多db.max.inlinks 指定的内链数会添加进来。 如果被激活,URLFilter可以应用到所有的目标URL及其内链中。如果目标链接被禁止,所有的该目标链接的内链将和目标链接一起被移去。如果某些内链被禁止,那么只有他们会被移去,在校验上面提到的最大限制数时他们不会被计算在内。 <br />使用方法: <br />bin/nutch mergelinkdb output_linkdb linkdb1 [linkdb2 linkdb3 ...] [-filter] <br />参数说明: <br />output_linkdb:输出linkdb <br />linkdb1 [linkdb2 linkdb3 ...]: 多于一个的输入LinkDb(s) <br />-filter: Actual URLFilters to be applied on urls and links in LinkDb(s). <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />15. mergesegs <br />它是“org.apache.nutch.segment.SegmentMerger”的代称,用于合并多个segment,可以选择性地输出到一个或者多个固定大小的segment中。 <br />使用方法: <br />Shell代码 <br />bin/nutch mergesegs output_dir (-dir segments | seg1 seg2 ...) [-filter] [-slice NNNN]</p>
<p>bin/nutch mergesegs output_dir (-dir segments | seg1 seg2 ...) [-filter] [-slice NNNN]</p>
<p>参数说明: <br />output_dir:结果segment的名称或者segment片的父目录 <br />-dir segments:父目录,包括多个segment <br />seg1 seg2 ...:segment目录列表 <br />-filter:通过URLFilters过滤 <br />-slice NNNN: 创建多个输出segment,每一个中包括了NNNN个URL。</p>
<p>配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />16. dedup <br />“dedup”是“org.apache.nutch.indexer.DeleteDuplicates”的别名,它segment indexes中去掉重复的页面。 <br />使用方法: <br />Shell代码 <br />bin/nutch dedup <indexes> ...</p>
<p>bin/nutch dedup <indexes> ...<br />参数说明: <br /><indexes>:indexes索引文件 <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml <br />17. plugin <br />它是“org.apache.nutch.plugin.PluginRepository”的代称,用于从插件库中加载一个插件并执行其主方法。 <br />使用方法: <br />Shell代码 <br />bin/nutch plugin <pluginId> <className> [args ...]</p>
<p>bin/nutch plugin <pluginId> <className> [args ...]参数说明: <br /><pluginId>:期望执行的插件ID <br /><className>:包含主方法的类名 <br />[args]:传入插件的参数 <br />配置文件: <br />hadoop-default.xml <br />hadoop-site.xml <br />nutch-default.xml <br />nutch-site.xml</p>
</div>nutch java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequencesavagertnullhttp://liyanblog.cn/articles/2012/09/25/1348555726092.html2012-09-25T14:48:46+08:00<div class="content-head clearfix">
<h2 class="title content-title">nutch java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence</h2>
</div>
<div id="content" class="content mod-cs-content text-content clearfix">
<p>2) 修改配置文件指定索引库.( WEB-INFclasses下的nutch-site.xml):</p>
<p> <?xml version="1.0"?><br /> <?xml-stylesheet type="text/xsl" href="nutch-conf.xsl"?></p>
<p> <nutch-conf><br /> <property><br /> <name>searcher.dir</name><br /> <value>G:/nutch-0.9/crawled</value><br /> </property><br /> </nutch-conf></p>
<p>注意,当复制上述配置文件时,如果出现下列错误,是因为复制文件时带有空格或编码格式,重敲一遍即可: java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence</p>
</div>nutch 配置savagertnullhttp://liyanblog.cn/articles/2012/09/25/1348555710180.html2012-09-25T14:48:30+08:00<div class="content-head clearfix">
<h2 class="title content-title">nutch 配置</h2>
</div>
<div id="content" class="content mod-cs-content text-content clearfix">我的jdk 是1.5.x ,Tomcat是5.0.x<br /><br />1 下载0.9版本的包:里面已经包含了war文件,所以不需要Ant编译了<br /><br />2 安装Cygwin,这个没什么好说的(可以到网上搜到相关资料)。<br /><br />3 把Nutch借压缩到D:/nutch<br /><br />4 在D:/nutch下面建立一个文件 urls (没有后缀)<br /><br />http://www.xxx.edu.cn/<br /><br />5 在D:\nutch\conf\crawl-urlfilter.txt里面,加入<br /><br />+^http://www.xxx.edu.cn/<br /><br />6 环境变量加入<br /><br />NUTCH_JAVA_HOME = D:/jdk1.5.0_06 (注意 / 不要写成 \ 否则出现 找不到路径 )<br /><br />7 打开cygwin窗口,<br /><br />cd D:\nutch<br /><br />在D:\nutch下面执行<br /><br />bin/nutch crawl urls -dir crawled -depth 3 >& crawl.log<br />这个命令会在当前目录下建立一个crawled的文件夹,然后对刚才的http://www.xxx.edu.cn/的网站开始检索。<br />层数是3层,一般最好10层。然后结果输出在crawl.log里面<br />8 将nutch-0.7.2.war拷贝到tomcat/webapps下面,改名nutch<br />9 在D:\tomcat\conf\Catalina\localhost\ 建立nutch.xml<br /><Context path="" debug="5" privileged="true" docBase="nutch"/><br />10 启动tomcat,等war解开以后,打开<br />D:\tomcat\webapps\nutch\WEB-INF\classes\nutch-site.xml<br />修改如下<br /><nutch-conf><property> <name>searcher.dir</name> <value>D:/nutch/crawled/</value></property></nutch-conf><br />11 D:\tomcat\webapps\nutch\zh\include 下面新建header.jsp,内容就是复制header.html,但是<br />前面加上<br /><%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><br />在D:\tomcat\webapps\nutch\search.jsp里面,找到并修改为<br /><jsp:include page="<%= language + "/include/header.jsp"%>"/><br />顺便把下面js注释掉<br />function queryfocus() { <br />//search.query.focus(); }<br />12 D:\tomcat\conf\server.xml 找到以下段,并修改<br /> <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true" /><br />好了,到此,重启tomcat,访问 http://localhost:8080/ 就可以看到搜索主页了,而且搜索支持中文<br />和分词,虽然分得不是很好。</div>