Nutch源码研究.docx
上传人:qw****27 上传时间:2024-09-12 格式:DOCX 页数:20 大小:73KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

Nutch源码研究.docx

Nutch源码研究.docx

预览

免费试读已结束,剩余 10 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Nutch源码研究—抓取1.搜索引擎Nutch源代码研究之一网页抓取(1)关键字:nutch搜索引擎Nutch源代码研究之一网页抓取:Nutch的爬虫代码部分主要集中在:packageorg.apache.nutch.fetcher和插件protocol-fileProtocol-ftpprotocol-httpprotocol-httpclient以及相应的Parser插件中:下面我们先从org.apache.nutch.fetcher开始:最主要的类是Fetcher类,我们从它入手一步步跟踪整个代码:我们从run函数入手:首先:for(inti=0;i<threadCount;i++){//spawnthreadsFetcherThreadthread=newFetcherThread(THREAD_GROUP_NAME+i);thread.start();}建立了多个FetcherThread线程来抓取网页,threadCount可以配置或者使用默认值。接着一个while(true)的循环里面的代码:intn=group.activeCount();Thread[]list=newThread[n];group.enumerate(list);booleannoMoreFetcherThread=true;//assumptionfor(inti=0;i<n;i++){//thisthreadmayhavegoneawayinthemeantimeif(list[i]==null)continue;Stringtname=list[i].getName();if(tname.startsWith(THREAD_GROUP_NAME))//proveitnoMoreFetcherThread=false;if(LOG.isLoggable(Level.FINE))LOG.fine(list[i].toString());}if(noMoreFetcherThread){if(LOG.isLoggable(Level.FINE))LOG.fine("numberofactivethreads:"+n);if(pages==pages0&&errors==errors0&&bytes==bytes0)break;status();pages0=pages;errors0=errors;bytes0=bytes;}相当于维护一个线程池,并在Log中输入抓取页面的速度,状态之类的信息。其实可以使用java.util.concurrent包的Executors来创建一个线程池来使用。现在我们看看抓取的线程FetcherThread是如何工作的:线程当然要从run方法来跟踪了:FetchListEntryfle=newFetchListEntry();建立一个抓取列表类,为了不分散精力,我们稍候在看看这个FetchListEntry以及相关类的数据结构。然后又是一个while(true)的循环,我们看看里面做了些什么:if(fetchList.next(fle)==null)break;url=fle.getPage().getURL().toString();从当前的FetchListEntry中获得一个要抓取的url,然后if(!fle.getFetch()){//shouldwefetchthispage?if(LOG.isLoggable(Level.FINE))LOG.fine("notfetching"+url);handleFetch(fle,newProtocolOutput(null,ProtocolStatus.STATUS_NOTFETCHING));continue;}如果不需要抓取,在handleFetch进行相应的处理。然后又是一个do…while循环,用来处理抓取过程中重定向指定的次数:整个循环的条件refetch&&(redirCnt<MAX_REDIRECT)重新抓取并且重定向次数没有超出最大次数ProtocolFactory工厂创建protocol实例:Protocolprotocol=ProtocolFactory.getProtocol(url);Protocol的实现是以插件的形式提供的,我们先跳过Protocol实现的细节:可以从protocol中获取到Fetch的输出流:ProtocolOutputoutput=protocol.getProtocolOutput(fle);通过输出流可以获取到抓取的状态ProtocolStatus和抓取的内容Conten