資源描述:
《用c#實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、網(wǎng)絡(luò)爬蟲在信息檢索與處理中有很大的作用,是收集網(wǎng)絡(luò)信息的重要工具。接下來就介紹一下爬蟲的簡單實(shí)現(xiàn)。爬蟲的工作流程如下爬蟲自指定的URL地址開始下載網(wǎng)絡(luò)資源,直到該地址和所有子地址的指定資源都下載完畢為止。http://mmm.qqq23.com下面開始逐步分析爬蟲的實(shí)現(xiàn)。?1.待下載集合與已下載集合為了保存需要下載的URL,同時防止重復(fù)下載,我們需要分別用了兩個集合來存放將要下載的URL和已經(jīng)下載的URL。因?yàn)樵诒4鎁RL的同時需要保存與URL相關(guān)的一些其他信息,如深度,所以這里我采用了Dictionary來存放這些U
2、RL。具體類型是Dictionary其中string是Url字符串,int是該Url相對于基URL的深度。每次開始時都檢查未下載的集合,如果已經(jīng)為空,說明已經(jīng)下載完畢;如果還有URL,那么就取出第一個URL加入到已下載的集合中,并且下載這個URL的資源。?2.HTTP請求和響應(yīng)C#已經(jīng)有封裝好的HTTP請求和響應(yīng)的類HttpWebRequest和HttpWebResponse,所以實(shí)現(xiàn)起來方便不少。為了提高下載的效率,http://www.qqq100.com我們可以用多個請求并發(fā)的方式同時下載
3、多個URL的資源,一種簡單的做法是采用異步請求的方法??刂撇l(fā)的數(shù)量可以用如下方法實(shí)現(xiàn)1privatevoidDispatchWork()2{3if(_stop)//判斷是否中止下載4{5return;6}7for(inti=0;i<_reqCount;i++)8{9if(!_reqsBusy[i])//判斷此編號的工作實(shí)例是否空閑10{11RequestResource(i);//讓此工作實(shí)例請求資源12}13}14}?由于沒有顯式開新線程,所以用一個工作實(shí)例來表示一個邏輯工作線程1privatebool[]_req
4、sBusy=null;//每個元素代表一個工作實(shí)例是否正在工作2privateint_reqCount=4;//工作實(shí)例的數(shù)量?每次一個工作實(shí)例完成工作,相應(yīng)的_reqsBusy就設(shè)為false,并調(diào)用DispatchWork,那么DispatchWork就能給空閑的實(shí)例分配新任務(wù)了。??接下來是發(fā)送請求1privatevoidRequestResource(intindex)2{3intdepth;4stringurl="";5try6{7lock(_locker)8{9if(_urlsUnload.Count<=0
5、)10{11_workingSignals.FinishWorking(index);12return;13}14_reqsBusy[index]=true;15_workingSignals.StartWorking(index);16depth=_urlsUnload.First().Value;17url=_urlsUnload.First().Key;18_urlsLoaded.Add(url,depth);19_urlsUnload.Remove(url);20}2122HttpWebRequestreq=(
6、HttpWebRequest)WebRequest.Create(url);23req.Method=_method;//請求方法24req.Accept=_accept;//接受的內(nèi)容25req.UserAgent=_userAgent;//用戶代理26RequestStaters=newRequestState(req,url,depth,index);//回調(diào)方法的參數(shù)27varresult=req.BeginGetResponse(newAsyncCallback(ReceivedResource),rs);/
7、/異步請求28ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,//注冊超時處理方法29TimeoutCallback,rs,_maxTime,true);30}31catch(WebExceptionwe)32{33MessageBox.Show("RequestResource"+we.Message+url+we.Status);34}35}第26行的請求的額外信息在異步請求的回調(diào)方法作為參數(shù)傳入,之后還會提到。第27行開始異步請求,這里需
8、要傳入一個回調(diào)方法作為響應(yīng)請求時的處理,同時傳入回調(diào)方法的參數(shù)。第28行給該異步請求注冊一個超時處理方法TimeoutCallback,最大等待時間是_maxTime,且只處理一次超時,并傳入請求的額外信息作為回調(diào)方法的參數(shù)。?RequestState的定義是1classRequestState2{3privateconstint