Csharp/C#教程:C#制作多线程处理强化版网络爬虫分享

上次做了一个帮公司妹子做了爬虫,不是很精致,这次公司项目里要用到,于是有做了一番修改,功能添加了网址图片采集,下载,线程处理界面网址图片下载等。

说说思路:首相获取初始网址的所有内容在初始网址采集图片去初始网址采集链接把采集到的链接放入队列继续采集图片,然后继续采集链接,无限循环

还是上图片大家看一下,

C#制作多线程处理强化版网络爬虫

处理网页内容抓取跟网页网址爬取都做了改进,下面还是大家来看看代码,有不足之处,还请之处!

网页内容抓取HtmlCodeRequest,

网页网址爬取GetHttpLinks,用正则去筛选html中的Links

图片抓取GetHtmlImageUrlList,用正则去筛选html中的Img

都写进了一个封装类里面HttpHelper

///<summary> ///取得HTML中所有图片的URL。 ///</summary> ///<paramname="sHtmlText">HTML代码</param> ///<returns>图片的URL列表</returns> publicstaticstringHtmlCodeRequest(stringUrl) { if(string.IsNullOrEmpty(Url)) { return""; } try { //创建一个请求 HttpWebRequesthttprequst=(HttpWebRequest)WebRequest.Create(Url); //不建立持久性链接 httprequst.KeepAlive=true; //设置请求的方法 httprequst.Method="GET"; //设置标头值 httprequst.UserAgent="User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.2;.NETCLR1.0.3705"; httprequst.Accept="*/*"; httprequst.Headers.Add("Accept-Language","zh-cn,en-us;q=0.5"); httprequst.ServicePoint.Expect100Continue=false; httprequst.Timeout=5000; httprequst.AllowAutoRedirect=true;//是否允许302 ServicePointManager.DefaultConnectionLimit=30; //获取响应 HttpWebResponsewebRes=(HttpWebResponse)httprequst.GetResponse(); //获取响应的文本流 stringcontent=string.Empty; using(System.IO.Streamstream=webRes.GetResponseStream()) { using(System.IO.StreamReaderreader=newStreamReader(stream,System.Text.Encoding.GetEncoding("utf-8"))) { content=reader.ReadToEnd(); } } //取消请求 httprequst.Abort(); //返回数据内容 returncontent; } catch(Exception) { return""; } } ///<summary> ///提取页面链接 ///</summary> ///<paramname="html"></param> ///<returns></returns> publicstaticList<string>GetHtmlImageUrlList(stringurl) { stringhtml=HttpHelper.HtmlCodeRequest(url); if(string.IsNullOrEmpty(html)) { returnnewList<string>(); } //定义正则表达式用来匹配img标签 RegexregImg=newRegex(@"<imgb[^<>]*?bsrc[strn]*=[strn]*[""']?[strn]*(?<imgUrl>[^strn""'<>]*)[^<>]*?/?[strn]*>",RegexOptions.IgnoreCase); //搜索匹配的字符串 MatchCollectionmatches=regImg.Matches(html); List<string>sUrlList=newList<string>(); //取得匹配项列表 foreach(Matchmatchinmatches) sUrlList.Add(match.Groups["imgUrl"].Value); returnsUrlList; } ///<summary> ///提取页面链接 ///</summary> ///<paramname="html"></param> ///<returns></returns> publicstaticList<string>GetHttpLinks(stringurl) { //获取网址内容 stringhtml=HttpHelper.HtmlCodeRequest(url); if(string.IsNullOrEmpty(html)) { returnnewList<string>(); } //匹配http链接 conststringpattern2=@"http(s)?://([w-]+.)+[w-]+(/[w-./?%&=]*)?"; Regexr2=newRegex(pattern2,RegexOptions.IgnoreCase); //获得匹配结果 MatchCollectionm2=r2.Matches(html); List<string>links=newList<string>(); foreach(Matchurl2inm2) { if(StringHelper.CheckUrlIsLegal(url2.ToString())||!StringHelper.IsPureUrl(url2.ToString())||links.Contains(url2.ToString())) continue; links.Add(url2.ToString()); } //匹配href里面的链接 conststringpattern=@"(?i)<as[^>]*?href=(['""]?)(?!javascript|__doPostBack)(?<url>[^'""s*#<>]+)[^>]*>";; Regexr=newRegex(pattern,RegexOptions.IgnoreCase); //获得匹配结果 MatchCollectionm=r.Matches(html); foreach(Matchurl1inm) { stringhref1=url1.Groups["url"].Value; if(!href1.Contains("http")) { href1=Global.WebUrl+href1; } if(!StringHelper.IsPureUrl(href1)||links.Contains(href1))continue; links.Add(href1); } returnlinks; }

这边下载图片有个任务条数限制,限制是200条。如果超过的话线程等待5秒,这里下载图片是异步调用的委托

publicstringDownLoadimg(stringurl) { if(!string.IsNullOrEmpty(url)) { try { if(!url.Contains("http")) { url=Global.WebUrl+url; } HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(url); request.Timeout=2000; request.UserAgent="User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.2;.NETCLR1.0.3705"; //是否允许302 request.AllowAutoRedirect=true; WebResponseresponse=request.GetResponse(); Streamreader=response.GetResponseStream(); //文件名 stringaFirstName=Guid.NewGuid().ToString(); //扩展名 stringaLastName=url.Substring(url.LastIndexOf(".")+1,(url.Length-url.LastIndexOf(".")-1)); FileStreamwriter=newFileStream(Global.FloderUrl+aFirstName+"."+aLastName,FileMode.OpenOrCreate,FileAccess.Write); byte[]buff=newbyte[512]; //实际读取的字节数 intc=0; while((c=reader.Read(buff,0,buff.Length))>0) { writer.Write(buff,0,c); } writer.Close(); writer.Dispose(); reader.Close(); reader.Dispose(); response.Close(); return(aFirstName+"."+aLastName); } catch(Exception) { return"错误:地址"+url; } } return"错误:地址为空"; }

话不多说,更多的需要大家自己去改进咯!欢迎读者来与楼主进行交流。

您可能感兴趣的文章:c#爬虫爬取京东的商品信息C#爬虫通过代理刷文章浏览量C#利用代理爬虫网页的实现方法利用C#实现最基本的小说爬虫示例代码C#简单爬虫案例分享C#多线程爬虫抓取免费代理IP的示例代码C#网络爬虫代码分享C#简单的爬取工具利用C#实现网络爬虫基于C#实现网络爬虫C#抓取网页Html源码基于C#实现网页爬虫用C#做网络爬虫的步骤教学

标签: 线程 多线程 网络爬虫 爬虫

C++中进行txt文件读入和写入的方法示例

C语言中对数组赋值的三种形式

上述就是C#学习教程:C#制作多线程处理强化版网络爬虫分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/907539.html

(0)
上一篇 2021年10月24日
下一篇 2021年10月24日

精彩推荐