欢迎来到天天文库
浏览记录
ID:22020452
大小:139.50 KB
页数:7页
时间:2018-10-26
《用c#实现网络爬虫》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、网络爬虫在信息检索与处理中有很大的作用,是收集网络信息的重要工具。接下来就介绍一下爬虫的简单实现。爬虫的工作流程如下爬虫自指定的URL地址开始下载网络资源,直到该地址和所有子地址的指定资源都下载完毕为止。http://mmm.qqq23.com下面开始逐步分析爬虫的实现。 1.待下载集合与已下载集合为了保存需要下载的URL,同时防止重复下载,我们需要分别用了两个集合来存放将要下载的URL和已经下载的URL。因为在保存URL的同时需要保存与URL相关的一些其他信息,如深度,所以这里我采用了Dictionary来存放这些U
2、RL。具体类型是Dictionary其中string是Url字符串,int是该Url相对于基URL的深度。每次开始时都检查未下载的集合,如果已经为空,说明已经下载完毕;如果还有URL,那么就取出第一个URL加入到已下载的集合中,并且下载这个URL的资源。 2.HTTP请求和响应C#已经有封装好的HTTP请求和响应的类HttpWebRequest和HttpWebResponse,所以实现起来方便不少。为了提高下载的效率,http://www.qqq100.com我们可以用多个请求并发的方式同时下载
3、多个URL的资源,一种简单的做法是采用异步请求的方法。控制并发的数量可以用如下方法实现1privatevoidDispatchWork()2{3if(_stop)//判断是否中止下载4{5return;6}7for(inti=0;i<_reqCount;i++)8{9if(!_reqsBusy[i])//判断此编号的工作实例是否空闲10{11RequestResource(i);//让此工作实例请求资源12}13}14} 由于没有显式开新线程,所以用一个工作实例来表示一个逻辑工作线程1privatebool[]_req
4、sBusy=null;//每个元素代表一个工作实例是否正在工作2privateint_reqCount=4;//工作实例的数量 每次一个工作实例完成工作,相应的_reqsBusy就设为false,并调用DispatchWork,那么DispatchWork就能给空闲的实例分配新任务了。 接下来是发送请求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;//接受的内容25req.UserAgent=_userAgent;//用户代理26RequestStaters=newRequestState(req,url,depth,index);//回调方法的参数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行的请求的额外信息在异步请求的回调方法作为参数传入,之后还会提到。第27行开始异步请求,这里需
8、要传入一个回调方法作为响应请求时的处理,同时传入回调方法的参数。第28行给该异步请求注册一个超时处理方法TimeoutCallback,最大等待时间是_maxTime,且只处理一次超时,并传入请求的额外信息作为回调方法的参数。 RequestState的定义是1classRequestState2{3privateconstint
此文档下载收益归作者所有