用c#实现网络爬虫

用c#实现网络爬虫

ID:22020452

大小:139.50 KB

页数:7页

时间:2018-10-26

用c#实现网络爬虫_第1页
用c#实现网络爬虫_第2页
用c#实现网络爬虫_第3页
用c#实现网络爬虫_第4页
用c#实现网络爬虫_第5页
资源描述:

《用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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。