zoukankan      html  css  js  c++  java
  • C#获取网页内容 (WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)

    获取网页数据有很多种方式。在这里主要讲述通过WebClient、WebBrowser和HttpWebRequest/HttpWebResponse三种方式获取网页内容。

    这里获取的是包括网页的所有信息。如果单纯需要某些数据内容。可以自己构造函数甄别抠除出来!一般的做法是根据源码的格式,用正则来过滤出你需要的内容部分。

    一、通过WebClient获取网页内容

    这是一种很简单的获取方式,当然,其它的获取方法也很简单。在这里首先要说明的是,如果为了实际项目的效率考虑,需要考虑在函数中分配一个内存区域。大概写法如下

    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. }
    //MemoryStream是一个支持储存区为内存的流。
     byte[] buffer = new byte[1024];
     using (MemoryStream memory = new MemoryStream())
        {
        int index = 1, sum = 0;
        while (index * sum < 100 * 1024)
        {
           index = reader.Read(buffer, 0, 1024);
           if (index > 0)
           {
               memory.Write(buffer, 0, index);
                sum += index;
           }
        }
        //网页通常使用utf-8或gb2412进行编码
        Encoding.GetEncoding("gb2312").GetString(memory.ToArray());
        if (string.IsNullOrEmpty(html))
        {
            return html;
        }
        else
        {
            Regex re = new Regex(@"charset=(? charset[/s/S]*?)[ |']");
            Match m = re.Match(html.ToLower());
            encoding = m.Groups[charset].ToString();
        }
        if (string.IsNullOrEmpty(encoding) || string.Equals(encoding.ToLower(), "gb2312"))
        {
           return html;
        }
    }
    好了,现在进入正题,WebClient获取网页数据的代码如下
    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. }
                //using System.IO;
                try
                {
                    WebClient webClient = new WebClient();
                    webClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
                    Byte[] pageData = webClient.DownloadData("http://www.360doc.com/content/11/0427/03/1947337_112596569.shtml");
                    //string pageHtml = Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句       
                    string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句
                    using (StreamWriter sw = new StreamWriter("e:\ouput.txt"))//将获取的内容写入文本
                    {
                        htm = sw.ToString();//测试StreamWriter流的输出状态,非必须
                        sw.Write(pageHtml);
                    }
                }
                catch (WebException webEx)
                {
                    Console.W
                }
    

    二、通过WebBrowser控件获取网页内容

    相对来说,这是一种最简单的获取方式。拖WebBrowser控件进去,然后匹配下面这段代码

    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. }
    WebBrowser web = new WebBrowser();
    web.Navigate("http://www.163.com");
    web.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(web_DocumentCompleted);
    void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
         WebBrowser web = (WebBrowser)sender;
         HtmlElementCollection ElementCollection = web.Document.GetElementsByTagName("Table");
         foreach (HtmlElement item in ElementCollection)
         {
             File.AppendAllText("Kaijiang_xj.txt", item.InnerText);
         }
    }

    三、使用HttpWebRequest/HttpWebResponse获取网页内容

    这是一种比较通用的获取方式。

    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. }  
  • 相关阅读:
    DBCA创建数据库ORA-01034 ORACLE not available
    Linux shell 内部变量
    ext4文件系统制作
    curses-键盘编码-openssl加解密【转】
    Linux 中的键盘映射【转】
    C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出【转】
    Linux下使用popen()执行shell命令【转】
    linux下获取按键响应事件【转】
    linux select函数:Linux下select函数的使用详解【转】
    OTA升级中关于update.zip包的一些总结【转】
  • 原文地址:https://www.cnblogs.com/alex-13/p/4844169.html
Copyright © 2011-2022 走看看