C#制作多線程處理強(qiáng)化版網(wǎng)絡(luò)爬蟲(chóng)
上次做了一個(gè)幫公司妹子做了爬蟲(chóng),不是很精致,這次公司項(xiàng)目里要用到,于是有做了一番修改,功能添加了網(wǎng)址圖片采集,下載,線程處理界面網(wǎng)址圖片下載等。
說(shuō)說(shuō)思路:首相獲取初始網(wǎng)址的所有內(nèi)容 在初始網(wǎng)址采集圖片 去初始網(wǎng)址采集鏈接 把采集到的鏈接放入隊(duì)列 繼續(xù)采集圖片,然后繼續(xù)采集鏈接,無(wú)限循環(huán)
還是上圖片大家看一下,
處理網(wǎng)頁(yè)內(nèi)容抓取跟網(wǎng)頁(yè)網(wǎng)址爬取都做了改進(jìn),下面還是大家來(lái)看看代碼,有不足之處,還請(qǐng)之處!
網(wǎng)頁(yè)內(nèi)容抓取HtmlCodeRequest,
網(wǎng)頁(yè)網(wǎng)址爬取GetHttpLinks,用正則去篩選html中的Links
圖片抓取GetHtmlImageUrlList,用正則去篩選html中的Img
都寫(xiě)進(jìn)了一個(gè)封裝類里面 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
      {
        //創(chuàng)建一個(gè)請(qǐng)求
        HttpWebRequest httprequst = (HttpWebRequest)WebRequest.Create(Url);
        //不建立持久性鏈接
        httprequst.KeepAlive = true;
        //設(shè)置請(qǐng)求的方法
        httprequst.Method = "GET";
        //設(shè)置標(biāo)頭值
        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;
        //獲取響應(yīng)
        HttpWebResponse webRes = (HttpWebResponse)httprequst.GetResponse();
        //獲取響應(yīng)的文本流
        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();
          }
        }
        //取消請(qǐng)求
        httprequst.Abort();
        //返回?cái)?shù)據(jù)內(nèi)容
        return content;
      }
      catch (Exception)
      {
        return "";
      }
    }
/// <summary>
    /// 提取頁(yè)面鏈接
    /// </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>();
      }
      // 定義正則表達(dá)式用來(lái)匹配 img 標(biāo)簽  
      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>();
      // 取得匹配項(xiàng)列表  
      foreach (Match match in matches)
        sUrlList.Add(match.Groups["imgUrl"].Value);
      return sUrlList;
    }
    /// <summary>
    /// 提取頁(yè)面鏈接
    /// </summary>
    /// <param name="html"></param>
    /// <returns></returns>
    public static List<string> GetHttpLinks(string url)
    {
      //獲取網(wǎng)址內(nèi)容
      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);
      //獲得匹配結(jié)果
      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);
      //獲得匹配結(jié)果
      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;
    }  
這邊下載圖片有個(gè)任務(wù)條數(shù)限制,限制是200條。如果超過(guò)的話線程等待5秒,這里下載圖片是異步調(diào)用的委托
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();
          //擴(kuò)展名
          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];
          //實(shí)際讀取的字節(jié)數(shù)
          int c = 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 "錯(cuò)誤:地址" + url;
        }
      }
      return "錯(cuò)誤:地址為空";
    }
話不多說(shuō),更多的需要大家自己去改進(jìn)咯!歡迎讀者來(lái)與樓主進(jìn)行交流。
上一篇:淺談C# 序列化與反序列化幾種格式的轉(zhuǎn)換
欄 目:C#教程
本文標(biāo)題:C#制作多線程處理強(qiáng)化版網(wǎng)絡(luò)爬蟲(chóng)
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6269.html
您可能感興趣的文章
- 01-10C#停止線程的方法
 - 01-10C#實(shí)現(xiàn)多線程下載文件的方法
 - 01-10C#實(shí)現(xiàn)多線程寫(xiě)入同一個(gè)文件的方法
 - 01-10C#獲取進(jìn)程或線程相關(guān)信息的方法
 - 01-10C#通過(guò)Semaphore類控制線程隊(duì)列的方法
 - 01-10C#線程隊(duì)列用法實(shí)例分析
 - 01-10C#實(shí)現(xiàn)ComboBox控件顯示出多個(gè)數(shù)據(jù)源屬性的方法
 - 01-10C#中實(shí)現(xiàn)一次執(zhí)行多條帶GO的sql語(yǔ)句實(shí)例
 - 01-10C#類的多態(tài)性詳解
 - 01-10C#中Equals方法的常見(jiàn)誤解
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
 - 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
 - 01-10C#停止線程的方法
 - 01-10C#實(shí)現(xiàn)清空回收站的方法
 - 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
 - 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
 
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 04-02jquery與jsp,用jquery
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
 - 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 01-10delphi制作wav文件的方法
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-10C#中split用法實(shí)例總結(jié)
 


