C# 網路編程之webBrowser擷取網頁url和下載網頁中圖片

來源:互聯網
上載者:User

該文章主要是通過C#網路編程的webBrowser擷取網頁中的url並簡單的嘗試瞎子啊網頁中的圖片,主要是為以後網路開發的基礎學習.其中主要的通過應用程式結合網頁知識、Regex實現瀏覽、擷取url、下載圖片三個功能.而且很清晰的解析了每一步都是以前一步為基礎實現的.

介面設計如所示,添加控制項,設定webBrowser1其Anchor屬性為Top、Bottom、Left、Right,實現對話方塊縮放;設定groupBox1其Dock(定義要綁到容器控制項的邊框)為Buttom,實現當瀏覽器縮放時groupBox1始終在最下邊;設定listBox其HorizontalScrollbar屬性為True,顯示水平捲軸.

//新添加命名空間  using System.Net;  using System.IO;using System.Text.RegularExpressions;  //Regex

點擊"瀏覽"按鈕,產生button1_Click(object sender, EventArgs e)點擊事件中添加如下代碼,實現瀏覽網頁:

private void button1_Click(object sender, EventArgs e){    webBrowser1.Navigate(textBox1.Text.Trim());         //顯示網頁}

.

點擊"擷取"按鈕,產生button2_Click(object sender, EventArgs e)點擊事件中添加如下代碼,通過擷取當前網頁的HTML內容,利用Regex擷取網頁中所有內容的URL超連結和圖片的URL,並顯示在listBox控制項中.

//定義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;                           //定義Regex匹配集合    //清空    listBox1.Items.Clear();    listBox2.Items.Clear();    //擷取    try    {                  //Regex擷取<a href></a>內容url        matches = Regex.Matches(str, "<a href=\"([^\"]*?)\".*?>(.*?)</a>", RegexOptions.IgnoreCase);        foreach (Match match in matches)        {            listBox1.Items.Add(match.Value.ToString());             }        //Regex擷取<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);    //異常處理    }}

其中MatchCollection Regex.Matches(string input,string pattern,RegexOption options)表示使用指定的匹配選項pattern在輸入的字串中搜尋指定Regex的所有結果.上面RegexOptions.IgnoreCase表示不區分大小寫匹配.因為下載中我會顯示下載成功結果到listBox2中,所以這裡使用num先計算圖片總數.

在"擷取"中我們已經擷取到了所有網頁內容的URL和圖片的URL,這裡想要下載圖片,但它的格式通常是:“<img src="http://www.baidu.com/img/bdlogo.gif

//點擊"下載"實現下載圖片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網頁製作中的超連結和圖片連結的基礎知識,更好的方便大家理解這篇文章.(參考趙豐年的《網頁製作教程》)


http://news.baidu.com




http://www.baidu.com/img/bdlogo.gif

我所接觸到的Regex一個是使用者名稱密碼設定和該網頁知識中,所以我也還需要去學習該部分知識.這裡主要用到3個Regex,其中下面兩個代碼非常有用:

/// <summary> /// 取得HTML中所有圖片的 URL/// </summary> /// <param name="sHtmlText">HTML代碼</param> /// <returns>圖片的URL列表</returns> public static string[] GetHtmlImageUrlList(string sHtmlText){    // 定義Regex用來匹配 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;}

/// <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內容,在通過簡單的Regex擷取<A href></A>內容;如果要下載圖片就要擷取圖片的URL<img src="">擷取src的網址,在下載該網址中的圖片,擷取方法還是使用Regex,下載方法可以使用很多,這裡採用的是檔案流,最好使用多線程等批量下載手段(免費:
主要通過該檔案介紹一些基本的網路知識,同時我也在不斷的學習研究,同時講解Regex和網頁基本的兩個概念知識.最後感謝文章中那個網址的博主及一些人,希望該文章能夠對大家有所協助,同時如果文章中有錯誤或不足之處,還請大家海涵.
http://blog.csdn.net/eastmount

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.