C# 网络编程之webBrowser获取网页url和下载网页中图片
該文章主要是通過C#網(wǎng)絡(luò)編程的webBrowser獲取網(wǎng)頁中的url并簡(jiǎn)單的嘗試下載網(wǎng)頁中的圖片,主要是為以后網(wǎng)絡(luò)開發(fā)的基礎(chǔ)學(xué)習(xí).其中主要的通過應(yīng)用程序結(jié)合網(wǎng)頁知識(shí)、正則表達(dá)式實(shí)現(xiàn)瀏覽、獲取url、下載圖片三個(gè)功能.而且很清晰的解析了每一步都是以前一步為基礎(chǔ)實(shí)現(xiàn)的.
一. 界面設(shè)計(jì)
界面設(shè)計(jì)如下圖所示,添加控件如圖,設(shè)置webBrowser1其Anchor屬性為Top、Bottom、Left、Right,實(shí)現(xiàn)對(duì)話框縮放;設(shè)置groupBox1其Dock(定義要綁到容器控件的邊框)為Buttom,實(shí)現(xiàn)當(dāng)瀏覽器縮放時(shí)groupBox1始終在最下邊;設(shè)置listBox其HorizontalScrollbar屬性為True,顯示水平滾動(dòng)條.
二. 源代碼
1.命名空間
//新添加命名空間 using System.Net; using System.IO; using System.Text.RegularExpressions; //正則表達(dá)式2.瀏覽
點(diǎn)擊"瀏覽"按鈕,生成button1_Click(object sender, EventArgs e)點(diǎn)擊事件中添加如下代碼,實(shí)現(xiàn)瀏覽網(wǎng)頁:
private void button1_Click(object sender, EventArgs e) {webBrowser1.Navigate(textBox1.Text.Trim()); //顯示網(wǎng)頁 }調(diào)用webBrowser的Navigate方法將指定位置的文檔加載到控件中,其中一種重載方法Navigate(urlString)將制定的統(tǒng)一資源定位符URL處的文檔加載到WebBrowser控件中替換上一個(gè)文檔.
3.獲取
點(diǎn)擊"獲取"按鈕,生成button2_Click(object sender, EventArgs e)點(diǎn)擊事件中添加如下代碼,通過獲取"html.OuterHtml"當(dāng)前網(wǎng)頁的HTML內(nèi)容,利用正則表達(dá)式獲取網(wǎng)頁中所有內(nèi)容的URL超鏈接和圖片的URL,并顯示在listBox控件中.
<strong>//定義num記錄listBox2中獲取到的圖片URL個(gè)數(shù) public int num = 0; //點(diǎn)擊"獲取"按鈕 private void button2_Click(object sender, EventArgs e) {HtmlElement html = webBrowser1.Document.Body; //定義HTML元素string str = html.OuterHtml; //獲取當(dāng)前元素的HTML代碼MatchCollection matches; //定義正則表達(dá)式匹配集合//清空listBox1.Items.Clear();listBox2.Items.Clear();//獲取try{ //正則表達(dá)式獲取<a href></a>內(nèi)容urlmatches = Regex.Matches(str, "<a href=\"([^\"]*?)\".*?>(.*?)</a>", RegexOptions.IgnoreCase);foreach (Match match in matches){listBox1.Items.Add(match.Value.ToString()); }//正則表達(dá)式獲取<img src=>圖片urlmatches = 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());}//記錄圖片總數(shù)num = listBox2.Items.Count;}catch (Exception msg){MessageBox.Show(msg.Message); //異常處理} }</strong>其中MatchCollection Regex.Matches(string input,string pattern,RegexOption options)表示使用指定的匹配選項(xiàng)pattern在輸入的字符串中搜索指定正則表達(dá)式的所有結(jié)果.上面RegexOptions.IgnoreCase表示不區(qū)分大小寫匹配.因?yàn)橄螺d中我會(huì)顯示下載成功結(jié)果到listBox2中,所以這里使用num先計(jì)算圖片總數(shù).
4.下載
在"獲取"中我們已經(jīng)獲取到了所有網(wǎng)頁內(nèi)容的URL和圖片的URL,這里想要下載圖片,但它的格式通常是:“<img src="http://www.baidu.com/img/bdlogo.gif"width="270" height="129">”所以這里只需要獲取src中的內(nèi)容實(shí)現(xiàn)訪問該圖片,在調(diào)用文件相關(guān)知識(shí)實(shí)現(xiàn)簡(jiǎn)單下載圖片.而獲取src中的值很顯然也是通過正則表達(dá)式獲取的.代碼如下:
//點(diǎn)擊"下載"實(shí)現(xiàn)下載圖片 private void button3_Click(object sender, EventArgs e) {string imgsrc = string.Empty; //定義//循環(huán)下載for (int j = 0; j < num; j++){string content = listBox2.Items[j].ToString(); //獲取圖片urlRegex reg = new Regex(@"<img.*?src=""(?<src>[^""]*)""[^>]*>", RegexOptions.IgnoreCase);MatchCollection mc = reg.Matches(content); //設(shè)定要查找的字符串foreach (Match m in mc){ try{WebRequest request = WebRequest.Create(m.Groups["src"].Value);//圖片src內(nèi)容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; //實(shí)際讀取的字節(jié)數(shù) 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);}}} } 該部分代碼可能存在幾個(gè)問題:(1).獲取圖片格式不一定是jpg格式,這里主要想展示一種思想,具體的不同圖片獲取設(shè)置一下即可;
(2).采用該文件流的方法下載速度很慢,可以采用其他方法,WebClient.DownloadFile()等,因?yàn)槲覄偤醚芯苛宋募R(shí)和網(wǎng)絡(luò)爬蟲,所以就采用了此基礎(chǔ)方法;
(3).代碼中的兩層循環(huán)有點(diǎn)多余,但MatchCollection mc獲取的是匹配集合,總體感覺此段還是有點(diǎn)亂;
(4).如果想批量下載圖片,最好使用上線程等知識(shí),同時(shí)采用一些優(yōu)秀的算法(強(qiáng)調(diào)是算法),內(nèi)存中獲取,該程序只是基礎(chǔ)知識(shí).
三. 運(yùn)行結(jié)果
運(yùn)行結(jié)果如下圖所示:點(diǎn)擊"瀏覽"按鈕可以實(shí)現(xiàn)瀏覽網(wǎng)頁,點(diǎn)擊"獲取"可以獲取網(wǎng)頁的URL并顯示在listBox控件中,最后點(diǎn)擊"下載"把圖片保存到E盤目錄下,下面就是瀏覽百度時(shí)下載的logo圖標(biāo).(如果圖片沒有源URL路徑,需要自己去實(shí)現(xiàn),如<img src="/sites/default/files/bitren_logo.gif">)
四. 網(wǎng)頁基礎(chǔ)知識(shí)
這里主要介紹HTML網(wǎng)頁制作中的超鏈接和圖片鏈接的基礎(chǔ)知識(shí),更好的方便大家理解這篇文章.(參考趙豐年的《網(wǎng)頁制作教程》)1.頁面鏈接
網(wǎng)頁中創(chuàng)建超鏈接需要使用A標(biāo)記符,結(jié)束標(biāo)記符為</A>.它的最基本屬性是href,用于指定超鏈接的目標(biāo),通過href屬性指定不同的值,可以創(chuàng)建不同類型的超鏈接.同時(shí)<A>和</A>之間可以用單擊對(duì)象作為超鏈接的源(文字或圖片).
如百度首頁中的:“<a href="http://news.baidu.com">新 聞</a>”.(錨點(diǎn)連接這里就不介紹)
2.插入圖片
在HTML中使用IMG標(biāo)記符向網(wǎng)頁中插入圖片,它的兩個(gè)必要基本屬性是src和alt.分別用于設(shè)置圖像文件的位置和替換文本.
(1).src屬性表示要插入圖像的文件名,必須包含絕對(duì)路徑或相對(duì)路徑.
(2).alt屬性表示圖像的簡(jiǎn)單文本說明,用于不能顯示圖像的瀏覽器或顯示時(shí)間過長(zhǎng)時(shí)先替換顯示.
如百度首頁的logo圖標(biāo)圖片“<img src="http://www.baidu.com/img/bdlogo.gif" width="270" height="129">”當(dāng)直接訪問該url時(shí)能訪問圖片,我們上面的程序主要就是通過這種方式下載網(wǎng)頁中的圖片的.如下圖:
五. 正則表達(dá)式
正則表達(dá)式(Regular Expression)就是一個(gè)字符構(gòu)成的串,它定義了一個(gè)用來搜索匹配字符串的模式.許多語言包括Perl、PHP、Python、JavaScript和JScript,都支持用正則表達(dá)式處理文本,一些文本編輯器用正則表達(dá)式實(shí)現(xiàn)高級(jí)“搜索-替換”功能.我所接觸到的正則表達(dá)式一個(gè)是用戶名密碼設(shè)置和該網(wǎng)頁知識(shí)中,所以我也還需要去學(xué)習(xí)該部分知識(shí).這里主要用到3個(gè)正則表達(dá)式,其中下面兩個(gè)代碼非常有用:
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) {// 定義正則表達(dá)式用來匹配 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(sHtmlText);int i = 0;string[] sUrlList = new string[matches.Count];// 取得匹配項(xiàng)列表 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">要檢索的內(nèi)容</param> /// <returns>IList</returns> public static IList<string> GetPicPath(string M_Content) {IList<string> im = new List<string>();//定義一個(gè)泛型字符類Regex reg = new Regex(@"<img.*?src=""(?<src>[^""]*)""[^>]*>", RegexOptions.IgnoreCase);MatchCollection mc = reg.Matches(M_Content); //設(shè)定要查找的字符串foreach (Match m in mc){im.Add(m.Groups["src"].Value);}return im; }六. 總結(jié)
該文章主要是做C#網(wǎng)絡(luò)知識(shí)中關(guān)于網(wǎng)絡(luò)爬蟲獲取URL和簡(jiǎn)單下載圖片的基礎(chǔ)講解,很清晰的講述了首先要獲取URL就需要瀏覽網(wǎng)頁,至少要獲取網(wǎng)頁HTML內(nèi)容,在通過簡(jiǎn)單的正則表達(dá)式獲取<A href></A>內(nèi)容;如果要下載圖片就要獲取圖片的URL<img src="">獲取src的網(wǎng)址,在下載該網(wǎng)址中的圖片,獲取方法還是使用正則表達(dá)式,下載方法可以使用很多,這里采用的是文件流,最好使用多線程等批量下載手段.(免費(fèi)下載地址:http://download.csdn.net/detail/eastmount/6355125)
主要通過該文件介紹一些基本的網(wǎng)絡(luò)知識(shí),同時(shí)我也在不斷的學(xué)習(xí)研究,同時(shí)講解正則表達(dá)式和網(wǎng)頁基本的兩個(gè)概念知識(shí).最后感謝文章中那個(gè)網(wǎng)址的博主及一些人,希望該文章能夠?qū)Υ蠹矣兴鶐椭?同時(shí)如果文章中有錯(cuò)誤或不足之處,還請(qǐng)大家海涵.
(By:Eastmount 2013-10-5 夜2點(diǎn)http://blog.csdn.net/eastmount)
總結(jié)
以上是生活随笔為你收集整理的C# 网络编程之webBrowser获取网页url和下载网页中图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 网络编程之webBrowser乱码
- 下一篇: 算法知识之最长公共子序列问题(动态规划)