資源描述:
《一個(gè)網(wǎng)絡(luò)爬蟲(chóng)java實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、http://www.cnblogs.com/FengYan/archive/2012/11/27/2788369.html#2566041?ZeroCrawlerV0.1是一只簡(jiǎn)單的多線(xiàn)程爬蟲(chóng),其基本架構(gòu)如下:???整個(gè)程序是這樣運(yùn)作的:Scheduler不斷從Queue取出URL,如果發(fā)現(xiàn)可用的爬蟲(chóng)(空閑線(xiàn)程),那么就將URL分給一只爬蟲(chóng)。然后爬蟲(chóng)完成下載網(wǎng)頁(yè),抽取URL,保存網(wǎng)頁(yè)的工作后就回歸Scheduler(變回空閑線(xiàn)程)。直到Queue沒(méi)有待爬取的URL,并且所有爬蟲(chóng)都空閑下來(lái),就停止程序。???S
2、cheduler的主要工作就是建立線(xiàn)程池,從Queue中取出URL,分配URL給線(xiàn)程。容易出錯(cuò)的地方是退出條件。如果只是判斷Queue為空就退出是不行的。因?yàn)檫@時(shí)可能還有爬蟲(chóng)在工作中,而它可能提取到新的URL加到Queue中。所以退出條件應(yīng)該是Queue為空且線(xiàn)程池的線(xiàn)程全部空閑。Scheduler實(shí)現(xiàn)如下:ViewCodepublicstaticvoidCrawl(Stringurl,StringsavePath){intcnt=1;longstartTime=System.currentTimeMillis
3、();AtomicIntegernumberOfThreads=newAtomicInteger();//記錄當(dāng)前使用的爬蟲(chóng)數(shù)ThreadPoolExecutorexecutor=newThreadPoolExecutor(m_maxThreads,m_maxThreads,3,TimeUnit.SECONDS,newLinkedBlockingQueue());//建立線(xiàn)程池Queue.Add(UrlUtility.Encode(UrlUtility.Normalizer(url)));/
4、/添加初始URL到Queue中try{while((url=Queue.Fetch())!=null){executor.execute(newPageCrawler(url,savePath,numberOfThreads));//將URL交給爬蟲(chóng)while((Queue.Size()==0&&numberOfThreads.get()!=0)
5、
6、(numberOfThreads.get()==m_maxThreads)){//防止提前退出sleep();}//if(cnt++>1000)break;if(Q
7、ueue.Size()==0&&numberOfThreads.get()==0)break;}}finally{executor.shutdown();}longuseTime=System.currentTimeMillis()-startTime;System.out.println("use"+Utility.ToStandardTime((int)(useTime/1000))+"tofinish"+cnt+"links");System.out.println("remainurl:"+Queue.
8、Size());}???Queue負(fù)責(zé)保存URL,判斷URL重復(fù)出現(xiàn)與否。目前的保存方式是先使用Hash判斷URL是否已經(jīng)保存過(guò),然后再將完整的URL整個(gè)保存到list中。從Queue中取出URL時(shí)使用廣度優(yōu)先原則。ViewCodepublicclassQueue{privatestaticHashSetm_appear=newHashSet();privatestaticLinkedListm_queue=newLinkedList();publ
9、icsynchronizedstaticvoidAdd(Stringurl){if(!m_appear.contains(url)){m_appear.add(url);m_queue.addLast(url);}}publicsynchronizedstaticStringFetch(){if(!m_queue.isEmpty()){returnm_queue.poll();}returnnull;}publicstaticintSize(){returnm_queue.size();}}????接下來(lái)逐一介
10、紹爬蟲(chóng)最重要的幾個(gè)功能,首先從獲取網(wǎng)頁(yè)開(kāi)始。網(wǎng)頁(yè)的獲取分為兩部分:一是下載網(wǎng)頁(yè),二是正解地對(duì)字節(jié)流進(jìn)行編碼。網(wǎng)頁(yè)下載使用httpclient-4.2.2完成,具體如下:ViewCode//偽裝用的agentprivatestaticString[]m_agent={"Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0)","Mozilla/4.0(c