1. 程式人生 > >C#網頁采集數據的幾種方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)

C#網頁采集數據的幾種方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)

var complete sys bre nth ews 寫入 保存 new

獲取網頁數據有很多種方式。在這裏主要講述通過WebClient、WebBrowser和HttpWebRequest/HttpWebResponse三種方式獲取網頁內容。

這裏獲取的是包括網頁的所有信息。如果單純需要某些數據內容。可以自己構造函數甄別摳除出來!一般的做法是根據源碼的格式,用正則來過濾出你需要的內容部分。

一、通過WebClient獲取網頁內容

這是一種很簡單的獲取方式,當然,其它的獲取方法也很簡單。在這裏首先要說明的是,如果為了實際項目的效率考慮,需要考慮在函數中分配一個內存區域。大概寫法如下

[csharp] view plain copy print?
  1. //MemoryStream是一個支持儲存區為內存的流。
  2. byte[] buffer = new byte[1024];
  3. using (MemoryStream memory = new MemoryStream())
  4. {
  5. int index = 1, sum = 0;
  6. while (index * sum < 100 * 1024)
  7. {
  8. index = reader.Read(buffer, 0, 1024);
  9. if (index > 0)
  10. {
  11. memory.Write(buffer, 0, index);
  12. sum += index;
  13. }
  14. }
  15. //網頁通常使用utf-8或gb2412進行編碼
  16. Encoding.GetEncoding("gb2312").GetString(memory.ToArray());
  17. if (string.IsNullOrEmpty(html))
  18. {
  19. return html;
  20. }
  21. else
  22. {
  23. Regex re = new Regex(@"charset=(? charset[/s/S]*?)[ |‘]");
  24. Match m = re.Match(html.ToLower());
  25. encoding = m.Groups[charset].ToString();
  26. }
  27. if (string.IsNullOrEmpty(encoding) || string.Equals(encoding.ToLower(), "gb2312"))
  28. {
  29. return html;
  30. }
  31. }
好了,現在進入正題,WebClient獲取網頁數據的代碼如下 [csharp] view plain copy print?
  1. //using System.IO;
  2. try
  3. {
  4. WebClient webClient = new WebClient();
  5. webClient.Credentials = CredentialCache.DefaultCredentials;//獲取或設置用於向Internet資源的請求進行身份驗證的網絡憑據
  6. Byte[] pageData = webClient.DownloadData("http://www.360doc.com/content/11/0427/03/1947337_112596569.shtml");
  7. //string pageHtml = Encoding.Default.GetString(pageData); //如果獲取網站頁面采用的是GB2312,則使用這句
  8. string pageHtml = Encoding.UTF8.GetString(pageData); //如果獲取網站頁面采用的是UTF-8,則使用這句
  9. using (StreamWriter sw = new StreamWriter("e:\\ouput.txt"))//將獲取的內容寫入文本
  10. {
  11. htm = sw.ToString();//測試StreamWriter流的輸出狀態,非必須
  12. sw.Write(pageHtml);
  13. }
  14. }
  15. catch (WebException webEx)
  16. {
  17. Console.W
  18. }

二、通過WebBrowser控件獲取網頁內容

相對來說,這是一種最簡單的獲取方式。拖WebBrowser控件進去,然後匹配下面這段代碼

[csharp] view plain copy print?
  1. WebBrowser web = new WebBrowser();
  2. web.Navigate("http://www.163.com");
  3. web.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(web_DocumentCompleted);
  4. void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  5. {
  6. WebBrowser web = (WebBrowser)sender;
  7. HtmlElementCollection ElementCollection = web.Document.GetElementsByTagName("Table");
  8. foreach (HtmlElement item in ElementCollection)
  9. {
  10. File.AppendAllText("Kaijiang_xj.txt", item.InnerText);
  11. }
  12. }

三、使用HttpWebRequest/HttpWebResponse獲取網頁內容

這是一種比較通用的獲取方式。

[csharp] view plain copy print?
  1. public void GetHtml()
  2. {
  3. var url = "http://www.360doc.com/content/11/0427/03/1947337_112596569.shtml";
  4. string strBuff = "";//定義文本字符串,用來保存下載的html
  5. int byteRead = 0;
  6. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
  7. HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
  8. //若成功取得網頁的內容,則以System.IO.Stream形式返回,若失敗則產生ProtoclViolationException錯 誤。在此正確的做法應將以下的代碼放到一個try塊中處理。這裏簡單處理
  9. Stream reader = webResponse.GetResponseStream();
  10. ///返回的內容是Stream形式的,所以可以利用StreamReader類獲取GetResponseStream的內容,並以StreamReader類的Read方法依次讀取網頁源程序代碼每一行的內容,直至行尾(讀取的編碼格式:UTF8)
  11. StreamReader respStreamReader = new StreamReader(reader,Encoding.UTF8);
  12. ///分段,分批次獲取網頁源碼
  13. char[] cbuffer = new char[1024];
  14. byteRead = respStreamReader.Read(cbuffer,0,256);
  15. while (byteRead != 0)
  16. {
  17. string strResp = new string(char,0,byteRead);
  18. strBuff = strBuff + strResp;
  19. byteRead = respStreamReader.Read(cbuffer,0,256);
  20. }
  21. using (StreamWriter sw = new StreamWriter("e:\\ouput.txt"))//將獲取的內容寫入文本
  22. {
  23. htm = sw.ToString();//測試StreamWriter流的輸出狀態,非必須
  24. sw.Write(strBuff);
  25. }
  26. }

C#網頁采集數據的幾種方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)