一、通过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. }

好了,现在进入正题,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. }

二、通过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. }

三、使用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. }

C#网页采集数据的几种方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)的更多相关文章

  1. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  2. Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式

    Linux就这个范儿 第18章  这里也是鼓乐笙箫  Linux读写内存数据的三种方式 P703 Linux读写内存数据的三种方式 1.read  ,write方式会在用户空间和内核空间不断拷贝数据, ...

  3. 讨论HTTP POST 提交数据的几种方式

    转自:http://www.cnblogs.com/softidea/p/5745369.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PU ...

  4. Day20-单表中获取表单数据的3种方式

    1. 搭建环境请参考:http://www.cnblogs.com/momo8238/p/7508677.html 2. 创建表结构 models.py from django.db import m ...

  5. 在.NET Core 中收集数据的几种方式

    APM是一种应用性能监控工具,可以帮助理解系统行为, 用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题, 通过汇聚业务系统各处理环节的实时数据,分析业务系统各事务处理的交易路径和处理 ...

  6. 【代码笔记】iOS-向服务器传JSON数据的两种方式

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  7. .NET MVC控制器向视图传递数据的四种方式

    .NET MVC控制器向视图传递数据的四种方式: 1.ViewBag  ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...

  8. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  9. Solr 删除数据的几种方式

    原文出处:http://blog.chenlb.com/2010/03/solr-delete-data.html 有时候需要删除 Solr 中的数据(特别是不重做索引的系统中,在重做索引期间).删除 ...

随机推荐

  1. springboot集成swagger2,构建优雅的Restful API

    swagger,中文“拽”的意思.它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试.另外swagger很容易构建restful风格的api,简单优雅 ...

  2. 国内混合APP开发技术选型

    http://www.sunzhongwei.com/weex-react-native-ionic-technology-selection 选谁? 企业级应用是要考虑性能和流畅度的, 如果只是做个 ...

  3. (原)MobileNetV2

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/9410574.html 论文: MobileNetV2: Inverted Residuals and ...

  4. Djnogo Web开发学习笔记(2)

    安   装 截止目前,https://www.djangoproject.com/download/提供的最新的Django的下载版本为1.6.4. Install Django You’ve got ...

  5. MySQL 数据的 截取,数据清洗

    Mysql字符串截取函数SUBSTRING的用法说明 函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(conte ...

  6. Error loading page Domain: WebKitErrorDomain Error Code: 101

    使用 WebView 组件,loading的过程中出现这个错误. 解决方案: webVIew 里面加 renderError={ (e) => { if (e === 'WebKitErrorD ...

  7. JAVA 线程池架构浅析

    经历了Java内存模型.JUC基础之AQS.CAS.Lock.并发工具类.并发容器.阻塞队列.atomic类后,我们开始JUC的最后一部分:线程池.在这个部分你将了解到下面几个部分: 线程池的基础架构 ...

  8. 【iCore4 双核心板_ARM】例程十一:DMA实验——存储器到存储器的传输

    实验原理: DAM(直接存储器访问)传输不需要占用CPU,可以在存储器至存储器实现高速的数据 传输.本实验采用DAM2控制器的数据流0,选用通道0进行数据传输.通过LED的颜色来 判断传输是否成功. ...

  9. 【WPF】自定义形状的按钮Button

    需求:做一个如下图所示的多边形按钮. <!-- 特殊形状的按钮 --> <Grid> <Polygon Points="0,0 140,0 190,42 140 ...

  10. git排除常用配置,svn与git共存时.gitignore配置

    #idea与myeclipse配置文件全部排除 *.class #package file*.war*.ear #kdiff3 ignore*.orig #maven ignoretarget/ #e ...