該文章主要是通過C#網絡編程的webBrowser獲取網頁中的url并簡單的嘗試下載網頁中的圖片,主要是為以后網絡開發的基礎學習.其中主要的通過應用程序結合網頁知識、正則表達式實現瀏覽、獲取url、下載圖片三個功能.而且很清晰的解析了每一步都是以前一步為基礎實現的.
一.界面設計
界面設計如下圖所示,添加控件如圖,設置webBrowser1其Anchor屬性為Top、Bottom、Left、Right,實現對話框縮放;設置groupBox1其Dock(定義要綁到容器控件的邊框)為Buttom,實現當瀏覽器縮放時groupBox1始終在最下邊;設置listBox其HorizontalScrollbar屬性為True,顯示水平滾動條.
二.源代碼
1.命名空間

- //新添加命名空間????
- using?System.Net;????
- using?System.IO;??
- using?System.Text.RegularExpressions;??//正則表達式??
2.瀏覽
點擊"瀏覽"按鈕,生成button1_Click(object sender, EventArgs e)點擊事件中添加如下代碼,實現瀏覽網頁:

- private?void?button1_Click(object?sender,?EventArgs?e)??
- {??
- ????webBrowser1.Navigate(textBox1.Text.Trim());?????????//顯示網頁??
- }??
調用webBrowser的Navigate方法將指定位置的文檔加載到控件中,其中一種重載方法Navigate(urlString)將制定的統一資源定位符URL處的文檔加載到WebBrowser控件中替換上一個文檔.
3.獲取
點擊"獲取"按鈕,生成button2_Click(object sender, EventArgs e)點擊事件中添加如下代碼,通過獲取"html.OuterHtml"當前網頁的HTML內容,利用正則表達式獲取網頁中所有內容的URL超鏈接和圖片的URL,并顯示在listBox控件中.

- <strong>//定義num記錄listBox2中獲取到的圖片URL個數??
- public?int?num?=?0;??
- //點擊"獲取"按鈕??
- private?void?button2_Click(object?sender,?EventArgs?e)??
- {??
- ????HtmlElement?html?=?webBrowser1.Document.Body;??????//定義HTML元素??
- ????string?str?=?html.OuterHtml;???????????????????????//獲取當前元素的HTML代碼??
- ????MatchCollection?matches;???????????????????????????//定義正則表達式匹配集合??
- ????//清空??
- ????listBox1.Items.Clear();??
- ????listBox2.Items.Clear();??
- ????//獲取??
- ????try??
- ????{????????????
- ????????//正則表達式獲取<a?href></a>內容url??
- ????????matches?=?Regex.Matches(str,?"<a?href=\"([^\"]*?)\".*?>(.*?)</a>",?RegexOptions.IgnoreCase);??
- ????????foreach?(Match?match?in?matches)??
- ????????{??
- ????????????listBox1.Items.Add(match.Value.ToString());???????
- ????????}??
- ????????//正則表達式獲取<img?src=>圖片url??
- ????????matches?=?Regex.Matches(str,?@"<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);??
- ????????foreach?(Match?match?in?matches)??
- ????????{??
- ????????????listBox2.Items.Add(match.Value.ToString());??
- ????????}??
- ????????//記錄圖片總數??
- ????????num?=?listBox2.Items.Count;??
- ????}??
- ????catch?(Exception?msg)??
- ????{??
- ????????MessageBox.Show(msg.Message);????//異常處理??
- ????}??
- }</strong>??
其中MatchCollection Regex.Matches(string input,string pattern,RegexOption options)表示使用指定的匹配選項pattern在輸入的字符串中搜索指定正則表達式的所有結果.上面RegexOptions.IgnoreCase表示不區分大小寫匹配.因為下載中我會顯示下載成功結果到listBox2中,所以這里使用num先計算圖片總數.
4.下載
在"獲取"中我們已經獲取到了所有網頁內容的URL和圖片的URL,這里想要下載圖片,但它的格式通常是:“<img src="http://www.baidu.com/img/bdlogo.gif"width="270" height="129">”所以這里只需要獲取src中的內容實現訪問該圖片,在調用文件相關知識實現簡單下載圖片.而獲取src中的值很顯然也是通過正則表達式獲取的.代碼如下:

- //點擊"下載"實現下載圖片??
- private?void?button3_Click(object?sender,?EventArgs?e)??
- {??
- ????string?imgsrc?=?string.Empty;?????????????//定義??
- ????//循環下載??
- ????for?(int?j?=?0;?j?<?num;?j++)??
- ????{??
- ????????string?content?=?listBox2.Items[j].ToString();????//獲取圖片url??
- ????????Regex?reg?=?new?Regex(@"<img.*?src=""(?<src>[^""]*)""[^>]*>",?RegexOptions.IgnoreCase);??
- ????????MatchCollection?mc?=?reg.Matches(content);????????//設定要查找的字符串??
- ????????foreach?(Match?m?in?mc)??
- ????????{??????????????????
- ????????????try??
- ????????????{??
- ????????????????WebRequest?request?=?WebRequest.Create(m.Groups["src"].Value);//圖片src內容??
- ????????????????WebResponse?response?=?request.GetResponse();??
- ????????????????//文件流獲取圖片操作??
- ????????????????Stream?reader?=?response.GetResponseStream();??
- ????????????????string?path?=?"E://"?+?j.ToString()?+?".jpg";????????//圖片路徑命名???
- ????????????????FileStream?writer?=?new?FileStream(path,?FileMode.OpenOrCreate,?FileAccess.Write);??
- ????????????????byte[]?buff?=?new?byte[512];??
- ????????????????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();??
- ????????????????//下載成功??
- ????????????????listBox2.Items.Add(path?+?":圖片保存成功!");???
- ????????????}??
- ????????????catch?(Exception?msg)??
- ????????????{??
- ????????????????MessageBox.Show(msg.Message);??
- ????????????}??
- ????????}??
- ????}??
- }??
該部分代碼可能存在幾個問題: (1).獲取圖片格式不一定是jpg格式,這里主要想展示一種思想,具體的不同圖片獲取設置一下即可; (2).采用該文件流的方法下載速度很慢,可以采用其他方法,WebClient.DownloadFile()等,因為我剛好研究了文件知識和網絡爬蟲,所以就采用了此基礎方法; (3).代碼中的兩層循環有點多余,但MatchCollection mc獲取的是匹配集合,總體感覺此段還是有點亂; (4).如果想批量下載圖片,最好使用上線程等知識,同時采用一些優秀的算法(強調是算法),內存中獲取,該程序只是基礎知識.
三.運行結果
運行結果如下圖所示:點擊"瀏覽"按鈕可以實現瀏覽網頁,點擊"獲取"可以獲取網頁的URL并顯示在listBox控件中,最后點擊"下載"把圖片保存到E盤目錄下,下面就是瀏覽百度時下載的logo圖標.(如果圖片沒有源URL路徑,需要自己去實現,如<img src="/sites/default/files/bitren_logo.gif">)
四.網頁基礎知識
這里主要介紹HTML網頁制作中的超鏈接和圖片鏈接的基礎知識,更好的方便大家理解這篇文章.(參考趙豐年的《網頁制作教程》) 1.頁面鏈接 網頁中創建超鏈接需要使用A標記符,結束標記符為</A>.它的最基本屬性是href,用于指定超鏈接的目標,通過href屬性指定不同的值,可以創建不同類型的超鏈接.同時<A>和</A>之間可以用單擊對象作為超鏈接的源(文字或圖片). 如百度首頁中的:“<a href="http://news.baidu.com">新 聞</a>”.(錨點連接這里就不介紹) 2.插入圖片 在HTML中使用IMG標記符向網頁中插入圖片,它的兩個必要基本屬性是src和alt.分別用于設置圖像文件的位置和替換文本. (1).src屬性表示要插入圖像的文件名,必須包含絕對路徑或相對路徑. (2).alt屬性表示圖像的簡單文本說明,用于不能顯示圖像的瀏覽器或顯示時間過長時先替換顯示. 如百度首頁的logo圖標圖片“<img src="http://www.baidu.com/img/bdlogo.gif" width="270" height="129">”當直接訪問該url時能訪問圖片,我們上面的程序主要就是通過這種方式下載網頁中的圖片的.如下圖:
五.正則表達式
正則表達式(Regular Expression)就是一個字符構成的串,它定義了一個用來搜索匹配字符串的模式.許多語言包括Perl、PHP、Python、JavaScript和JScript,都支持用正則表達式處理文本,一些文本編輯器用正則表達式實現高級“搜索-替換”功能.我所接觸到的正則表達式一個是用戶名密碼設置和該網頁知識中,所以我也還需要去學習該部分知識.這里主要用到3個正則表達式,其中下面兩個代碼非常有用:
1.獲取HTML中所有圖片的URL
(參考:http://blog.csdn.net/smeller/article/details/7108502)

- ///?<summary>???
- ///?取得HTML中所有圖片的?URL??
- ///?</summary>???
- ///?<param?name="sHtmlText">HTML代碼</param>???
- ///?<returns>圖片的URL列表</returns>???
- public?static?string[]?GetHtmlImageUrlList(string?sHtmlText)??
- {??
- ????//?定義正則表達式用來匹配?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(sHtmlText);??
- ????int?i?=?0;??
- ????string[]?sUrlList?=?new?string[matches.Count];??
- ????//?取得匹配項列表???
- ????foreach?(Match?match?in?matches)??
- ????{??
- ????????sUrlList[i++]?=?match.Groups["imgUrl"].Value;??
- ????}??
- ????return?sUrlList;??
- }??
2.獲得圖片的src路徑并保存
(參考:http://bbs.csdn.net/topics/320001867)

- ///?<summary>??
- ///?獲得圖片的路徑并存放??
- ///?</summary>??
- ///?<param?name="M_Content">要檢索的內容</param>??
- ///?<returns>IList</returns>??
- public?static?IList<string>?GetPicPath(string?M_Content)??
- {??
- ????IList<string>?im?=?new?List<string>();//定義一個泛型字符類??
- ????Regex?reg?=?new?Regex(@"<img.*?src=""(?<src>[^""]*)""[^>]*>",?RegexOptions.IgnoreCase);??
- ????MatchCollection?mc?=?reg.Matches(M_Content);?//設定要查找的字符串??
- ????foreach?(Match?m?in?mc)??
- ????{??
- ????????im.Add(m.Groups["src"].Value);??
- ????}??
- ????return?im;??
- }??
六.總結
該文章主要是做C#網絡知識中關于網絡爬蟲獲取URL和簡單下載圖片的基礎講解,很清晰的講述了首先要獲取URL就需要瀏覽網頁,至少要獲取網頁HTML內容,在通過簡單的正則表達式獲取<A href></A>內容;如果要下載圖片就要獲取圖片的URL<img src="">獲取src的網址,在下載該網址中的圖片,獲取方法還是使用正則表達式,下載方法可以使用很多,這里采用的是文件流,最好使用多線程等批量下載手段.(免費下載地址:http://download.csdn.net/detail/eastmount/6355125) 主要通過該文件介紹一些基本的網絡知識,同時我也在不斷的學習研究,同時講解正則表達式和網頁基本的兩個概念知識.最后感謝文章中那個網址的博主及一些人,希望該文章能夠對大家有所幫助,同時如果文章中有錯誤或不足之處,還請大家海涵.