上次做了一个帮公司妹子做了爬虫,不是很精致,这次公司项目里要用到,于是有做了一番修改,功能添加了网址图片采集,下载,线程处理界面网址图片下载等。
说说思路:首相获取初始网址的所有内容 在初始网址采集图片 去初始网址采集链接 把采集到的链接放入队列 继续采集图片,然后继续采集链接,无限循环
还是上图片大家看一下,
处理网页内容抓取跟网页网址爬取都做了改进,下面还是大家来看看代码,有不足之处,还请之处!
网页内容抓取HTMLCodeRequest,
网页网址爬取Gethttplinks,用正则去筛选HTML中的links
图片抓取GetHTMLImageUrlList,用正则去筛选HTML中的img
都写进了一个封装类里面 httpHelper
/// <summary> /// 取得HTML中所有图片的 URL。 /// </summary> /// <param name="sHTMLText">HTML代码</param> /// <returns>图片的URL列表</returns> public static string HTMLCodeRequest(string Url) { if (string.IsNullOrEmpty(Url)) { return ""; } try { //创建一个请求 httpWebRequest httprequst = (httpWebRequest)WebRequest.Create(Url); //不建立持久性链接 httprequst.KeepAlive = true; //设置请求的方法 httprequst.Method = "GET"; //设置标头值 httprequst.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; windows NT 5.2; .NET CLR 1.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; //获取响应 httpWebResponse webRes = (httpWebResponse)httprequst.GetResponse(); //获取响应的文本流 string content = string.Empty; using (System.IO.Stream stream = webRes.GetResponseStream()) { using (System.IO.StreamReader reader = new StreamReader(stream,System.Text.EnCoding.GetEnCoding("utf-8"))) { content = reader.ReadToEnd(); } } //取消请求 httprequst.Abort(); //返回数据内容 return content; } catch (Exception) { return ""; } }/// <summary> /// 提取页面链接 /// </summary> /// <param name="HTML"></param> /// <returns></returns>public static List<string> GetHTMLImageUrlList(string url) { string HTML = httpHelper.HTMLCodeRequest(url); if (string.IsNullOrEmpty(HTML)) { return new List<string>(); } // 定义正则表达式用来匹配 img 标签 Regex regimg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgurl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>",RegexOptions.IgnoreCase); // 搜索匹配的字符串 MatchCollection matches = regimg.Matches(HTML); List<string> sUrlList = new List<string>(); // 取得匹配项列表 foreach (Match match in matches) sUrlList.Add(match.Groups["imgurl"].Value); return sUrlList; } /// <summary> /// 提取页面链接 /// </summary> /// <param name="HTML"></param> /// <returns></returns> public static List<string> Gethttplinks(string url) { //获取网址内容 string HTML = httpHelper.HTMLCodeRequest(url); if (string.IsNullOrEmpty(HTML)) { return new List<string>(); } //匹配http链接 const string pattern2 = @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"; Regex r2 = new Regex(pattern2,RegexOptions.IgnoreCase); //获得匹配结果 MatchCollection m2 = r2.Matches(HTML); List<string> links = new List<string>(); foreach (Match url2 in m2) { if (StringHelper.CheckUrlisLegal(url2.ToString()) || !StringHelper.IsPureUrl(url2.ToString()) || links.Contains(url2.ToString())) continue; links.Add(url2.ToString()); } //匹配href里面的链接 const string pattern = @"(?i)<a\s[^>]*?href=(['""]?)(?!JavaScript|__doPostBack)(?<url>[^'""\s*#<>]+)[^>]*>"; ; Regex r = new Regex(pattern,RegexOptions.IgnoreCase); //获得匹配结果 MatchCollection m = r.Matches(HTML); foreach (Match url1 in m) { string href1 = url1.Groups["url"].Value; if (!href1.Contains("http")) { href1 = Global.WebUrl + href1; } if (!StringHelper.IsPureUrl(href1) || links.Contains(href1)) continue; links.Add(href1); } return links; }
这边下载图片有个任务条数限制,限制是200条。如果超过的话线程等待5秒,这里下载图片是异步调用的委托
public string DownLoadimg(string url) { if (!string.IsNullOrEmpty(url)) { try { if (!url.Contains("http")) { url = Global.WebUrl + url; } httpWebRequest request = (httpWebRequest)WebRequest.Create(url); request.Timeout = 2000; request.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; windows NT 5.2; .NET CLR 1.0.3705"; //是否允许302 request.AllowautoRedirect = true; WebResponse response = request.GetResponse(); Stream reader = response.GetResponseStream(); //文件名 string aFirstname = GuID.NewGuID().ToString(); //扩展名 string aLastname = url.Substring(url.LastIndexOf(".") + 1,(url.Length - url.LastIndexOf(".") - 1)); fileStream writer = new fileStream(Global.FloderUrl + aFirstname + "." + aLastname,fileMode.OpenorCreate,fileAccess.Write); byte[] buff = new byte[512]; //实际读取的字节数 int c = 0; while ((c = reader.Read(buff,buff.Length)) > 0) { writer.Write(buff,c); } writer.Close(); writer.dispose(); reader.Close(); reader.dispose(); response.Close(); return (aFirstname + "." + aLastname); } catch (Exception) { return "错误:地址" + url; } } return "错误:地址为空"; }
话不多说,更多的需要大家自己去改进咯!欢迎读者来与楼主进行交流。
总结以上是内存溢出为你收集整理的C#制作多线程处理强化版网络爬虫全部内容,希望文章能够帮你解决C#制作多线程处理强化版网络爬虫所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)