C#制作多線程處理強化版網(wǎng)絡爬蟲
上次做了一個幫公司妹子做了爬蟲,不是很精致,這次公司項目里要用到,于是有做了一番修改,功能添加了網(wǎng)址圖片采集,下載,線程處理界面網(wǎng)址圖片下載等。
說說思路:首相獲取初始網(wǎng)址的所有內(nèi)容 在初始網(wǎng)址采集圖片 去初始網(wǎng)址采集鏈接 把采集到的鏈接放入隊列 繼續(xù)采集圖片,然后繼續(xù)采集鏈接,無限循環(huán)
還是上圖片大家看一下,
處理網(wǎng)頁內(nèi)容抓取跟網(wǎng)頁網(wǎng)址爬取都做了改進,下面還是大家來看看代碼,有不足之處,還請之處!
網(wǎng)頁內(nèi)容抓取HtmlCodeRequest,
網(wǎng)頁網(wǎng)址爬取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 { //創(chuàng)建一個請求 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(); //返回數(shù)據(jù)內(nèi)容 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) { //獲取網(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; }
這邊下載圖片有個任務條數(shù)限制,限制是200條。如果超過的話線程等待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(); //擴展名 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]; //實際讀取的字節(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 "錯誤:地址" + url; } } return "錯誤:地址為空"; }
話不多說,更多的需要大家自己去改進咯!歡迎讀者來與樓主進行交流。
上一篇:淺談C# 序列化與反序列化幾種格式的轉(zhuǎn)換
欄 目:C#教程
下一篇:C#學習筆記整理
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6269.html
您可能感興趣的文章
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)多線程下載文件的方法
- 01-10C#實現(xiàn)多線程寫入同一個文件的方法
- 01-10C#獲取進程或線程相關(guān)信息的方法
- 01-10C#通過Semaphore類控制線程隊列的方法
- 01-10C#線程隊列用法實例分析
- 01-10C#實現(xiàn)ComboBox控件顯示出多個數(shù)據(jù)源屬性的方法
- 01-10C#中實現(xiàn)一次執(zhí)行多條帶GO的sql語句實例
- 01-10C#類的多態(tài)性詳解
- 01-10C#中Equals方法的常見誤解


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結(jié)