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

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

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

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

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

还是上图片大家看一下,

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

网页内容抓取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#制作多线程处理强化版网络爬虫所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1257610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存