程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 網絡編程之webBrowser獲取網頁url和下載網頁中圖片,

C# 網絡編程之webBrowser獲取網頁url和下載網頁中圖片,

編輯:C#入門知識

C# 網絡編程之webBrowser獲取網頁url和下載網頁中圖片,


該文章主要是通過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控件中.

//定義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);    //異常處理
    }
}

其中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 ">新&nbsp;聞</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 
主要通過該文件介紹一些基本的網絡知識,同時我也在不斷的學習研究,同時講解正則表達式和網頁基本的兩個概念知識.最後感謝文章中那個網址的博主及一些人,希望該文章能夠對大家有所幫助,同時如果文章中有錯誤或不足之處,還請大家海涵. 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved