获取网页数据有很多种方式。在这里主要讲述通过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. }

C#获取网页内容 (WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)的更多相关文章

  1. C#网页采集数据的几种方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)

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

  2. C#获取网页内容的三种方式

    C#通常有三种方法获取网页内容,使用WebClient.WebBrowser或者HttpWebRequest/HttpWebResponse... 方法一:使用WebClient (引用自:http: ...

  3. C#获取网页内容的三种方式(转)

    搜索网络,发现C#通常有三种方法获取网页内容,使用WebClient.WebBrowser或者HttpWebRequest/HttpWebResponse... 方法一:使用WebClient (引用 ...

  4. 【C#】获取网页内容及HTML解析器HtmlAgilityPack的使用

    最近经常需要下载一些东西,而这个下载地址又会经过层层跳转,每个页面上都有很多广告,烦不胜烦,所以做了一个一键获得最终下载地址的小工具.使用C#,来获取网页内容,然后通过HtmlAgilityPack获 ...

  5. HttpWebRequest,HttpWebResponse的用法和用途

    1.用途:HettpWebRequest,HettpWebResponse用途和webServers的作用差不多,都是得到一个页面传过来的值.HttpWebRequest 2.用法:--------- ...

  6. 定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容。提示(可以了解python的urllib模块)

    定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容.提示(可以了解python的urllib模块) import urllib.request def get_ ...

  7. 使用Jsoup获取网页内容超时设置

    使用Jsoup获取网页内容超时设置 最近使用Jsoup来抓取网页,并对网页进行解析,发现很好用.在抓取过程中遇到一个问题,有些页面总是报Timeout异常,开始想是不是被抓取网站对IP进行了限制,后来 ...

  8. 基于apache —HttpClient的小爬虫获取网页内容

    今天(17-03-31)忙了一下午研究webmagic,发现自己还太年轻,对于这样难度的框架(类库) 还是难以接受,还是从基础开始吧,因为相对基础的东西教程相多一些,于是乎我找了apache其下的 H ...

  9. 使用selenium和phantomJS浏览器获取网页内容的小演示

    # 使用selenium和phantomJS浏览器获取网页内容的小演示 # 导入包 from selenium import webdriver # 使用selenium库里的webdriver方法调 ...

随机推荐

  1. vim编辑器的简单使用

    写这篇文章是因为在更新我的一篇博客 Git的其他用法 的时候,里面的修改已经提交的commit说明这一部分需要用到vim. 在使用git config --global --edit或者git reb ...

  2. java访问权限的问题

    java访问权限的问题 java 访问权限 修饰符 背景: 关于java中的四种访问修饰符,public ,default ,protected ,private的作用范围本以为很熟悉了,但碰到了这样 ...

  3. hdu1045

    #include<iostream> using namespace std; int count = 0, n = 0; //判断该ch[x][y]是否可以放置 bool isOk(ch ...

  4. python虚拟环境的使用

    一. 安装 sudo apt-get install python-virtualenv 二. 创建环境 sudo virtualenv Myenv 创建完全隔离的Python环境,实质是创建了一个文 ...

  5. IntelliJ IDEA 设置代码提示或自动补全的快捷键 (附IntelliJ IDEA常用快捷键)

    修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings- Ctrl+Alt+S), –> 打开设置对话框. 在左侧的导航框中点击 KeyMap. 接着在右边的树型框 ...

  6. js遍历数组对象和非数组对象

    //---------for用来遍历数组对象 var i,myArr = ["a","b","c"]; ; i < myArr.len ...

  7. FaceBook页面加载技术

    1. 技术背景 FaceBook页面加载技术 试想这样一个场景,一个经常访问的网站,每次打开它的页面都要要花费6 秒:同时另外一个网站提供了相似的服务,但响应时间只需3 秒,那么你会如何选择呢?数据表 ...

  8. HDU 5904 LCIS

    $dp$. 这题的突破口在于要求数字是连续的. 可以分别记录两个串以某个数字为结尾的最长上升长度,然后枚举一下以哪个数字为结尾就可以得到答案了. 因为$case$有点多,不能每次$memset$,额外 ...

  9. 《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

    ---恢复内容开始--- 基本的浮点数指令 示例代码: Visual Studio 2013的反汇编代码是: 对于movss,表示移动标量单精度浮点值 将标量单精度浮点值从源操作数(第二个操作数)移到 ...

  10. 关于ajax的短轮询问题

    利用前台的ajax不断向后台服务器请求,后台服务器不断查看数据库里的信息是否变化.若变化将信息返回前台,并执行一些操作 前台ajax代码 注意要加上cache这一项,如果是post请求的化,可以免了. ...