夜鹰教程网-程序员的加油站
 当前位置:文章中心 >> Asp.net专题(WCF/WPF/WF)
c#数据采集原理
夜鹰教程网 来源:www.yyjcw.com 日期:2017-10-21 10:18:43
​获取网页数据有很多种方式。在这里主要讲述通过WebClient、WebBrowser和HttpWebRequest/HttpWebResponse三种方式获取网页内容。
这里获取的是包括网页的所有信息。如果单纯需要某些数据内容。可以自己构造函数甄别抠除出来!一般的做法是根据源码的格式,用正则来过滤出你需要的内容部分。
一、通过WebClient获取网页内容

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

    //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获取网页数据的代码如下
[csharp] view plaincopyprint?

    //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控件进去,然后匹配下面这段代码
[csharp] view plaincopyprint?

    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获取网页内容

这是一种比较通用的获取方式。
[csharp] view plaincopyprint?

    public void GetHtml()  
         {  
             var url = "http://www.360doc.com/content/11/0427/03/1947337_112596569.shtml";  
             string strBuff = "";//定义文本字符串,用来保存下载的html  
             int byteRead = 0;   
               
             HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);  
             HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();  
             //若成功取得网页的内容,则以System.IO.Stream形式返回,若失败则产生ProtoclViolationException错 误。在此正确的做法应将以下的代码放到一个try块中处理。这里简单处理   
             Stream reader = webResponse.GetResponseStream();  
             ///返回的内容是Stream形式的,所以可以利用StreamReader类获取GetResponseStream的内容,并以StreamReader类的Read方法依次读取网页源程序代码每一行的内容,直至行尾(读取的编码格式:UTF8)  
             StreamReader respStreamReader = new StreamReader(reader,Encoding.UTF8);  
      
             ///分段,分批次获取网页源码  
             char[] cbuffer = new char[1024];  
             byteRead = respStreamReader.Read(cbuffer,0,256);  
      
             while (byteRead != 0)  
             {  
                 string strResp = new string(char,0,byteRead);  
                 strBuff = strBuff + strResp;  
                 byteRead = respStreamReader.Read(cbuffer,0,256);  
             }  
             using (StreamWriter sw = new StreamWriter("e:\\ouput.txt"))//将获取的内容写入文本  
             {  
                 htm = sw.ToString();//测试StreamWriter流的输出状态,非必须  
                 sw.Write(strBuff);  
             }  
         } 
复制链接 网友评论 收藏本文 关闭此页
上一条: C#开发Windows Service 服务程序  下一条: c#获取时间戳
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  热点推荐
表单提交中get和post方式的区别有…
解决ASP中UTF-8与GB2312编码转换乱…
asp数组中REDIM的用法(动态数组)…
生成html的新方法ASP
ASP字符串函数大全
ASP生成Word文件的代码
ASP中Randomize随机函数的使用
十天学会ASP教程之第一天:安装调…
自定义的asp日期格式化函数
防范ASP网站漏洞的八大法则之一
十天学会ASP教程之第二天:表单传…
asp中关于从utf8页面到gb2312页面…
ASP教程:实现长文章分页功能
IIS6架设网站的问题总结
五分钟打开 allow_url_fopen 的最…
  最近更新
C# Json数据中的特殊字符导致页面…
博客园是有开发博客查询相关的接口…
C#里面的ref和out区别
C#调用API让声卡发出声音
.NET使用反射读取用户自定义的枚举…
.net操作SqlServer数据库增删改查…
如何将WCF服务部署到远程服务器
对WebApi 实现服务端信息的监控
用WCF生成Restful风格的接口返回 …
只有一个地址如何调用WCF服务
WCF简介
搭一个简单的wcf服务
WCF配置说明
WCF传输的数据量过大问题的解决方…
asp.net大文件分块上传文件秒传断…

关于我们 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3