C# .net 抓取网页内容

ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题。

1、抓取一般内容

需要三个类:WebRequest、WebResponse、StreamReader

所需命名空间:System.Net、System.IO

核心代码:

WebRequest 类的 Create 为静态方法,参数为要抓取的网页的网址;

Encoding 指定编码,Encoding 中有属性 ASCII、UTF32、UTF8 等全球通用的编码,但没有 gb2312 这个编码属性,所以我们使用 GetEncoding 获得 gb2312 编码。

[c-sharp] view plaincopy

  1. private string GetGeneralContent(string strUrl)
  2. {
  3. string strMsg = string.Empty;
  4. try
  5. {
  6. WebRequest request = WebRequest.Create(strUrl);
  7. WebResponse response = request.GetResponse();
  8. StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
  9. strMsg = reader.ReadToEnd();
  10. reader.Close();
  11. reader.Dispose();
  12. response.Close();
  13. }
  14. catch
  15. { }
  16. return strMsg;
  17. }

2、抓取图片或其它二进制文件(如文件)

需要四个类:WebRequest、WebResponse、Stream、FileStream

所需命名空间:System.Net、System.IO

核心代码:用Stream读取

[c-sharp] view plaincopy

  1. private string GetFileContent(string strUrl)
  2. {
  3. string strMsg = string.Empty;
  4. try
  5. {
  6. WebRequest request = WebRequest.Create(strUrl);
  7. WebResponse response = request.GetResponse();
  8. Stream reader = response.GetResponseStream();
  9. //可根据实际保存为具体文件
  10. FileStream writer = new FileStream("D://logo.gif", FileMode.OpenOrCreate, FileAccess.Write);
  11. byte[] buff = new byte[512];
  12. int c = 0; //实际读取的字节数
  13. while ((c=reader.Read(buff, 0, buff.Length)) > 0)
  14. {
  15. writer.Write(buff, 0, c);
  16. }
  17. writer.Close();
  18. writer.Dispose();
  19. reader.Close();
  20. reader.Dispose();
  21. response.Close();
  22. strMsg = "保存成功";
  23. }
  24. catch
  25. { }
  26. return strMsg;
  27. }

3、抓取网页内容  POST方式

在抓取网页时,有时候,需要将某些数据通过 Post 的方式发送到服务器,将以下代码添加在网页抓取的程序中,以实现将用户名和密码 Post 到服务器:

[c-sharp] view plaincopy

  1. private string GetPostContent(string strUrl)
  2. {
  3. string strMsg = string.Empty;
  4. try
  5. {
  6. string data = "userName=admin&passwd=admin888";
  7. byte[] requestBuffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data);
  8. WebRequest request = WebRequest.Create(strUrl);
  9. request.Method = "POST";
  10. request.ContentType = "application/x-www-form-urlencoded";
  11. request.ContentLength = requestBuffer.Length;
  12. using (Stream requestStream = request.GetRequestStream())
  13. {
  14. requestStream.Write(requestBuffer, 0, requestBuffer.Length);
  15. requestStream.Close();
  16. }
  17. WebResponse response = request.GetResponse();
  18. using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")))
  19. {
  20. strMsg = reader.ReadToEnd();
  21. reader.Close();
  22. }
  23. }
  24. catch
  25. { }
  26. return strMsg;
  27. }

4、ASP.NET 抓取网页内容-防止重定向

在抓取网页时,成功登录服务器应用系统后,应用系统可能会通过 Response.Redirect 将网页进行重定向,如果不需要响应这个重定向,那么,我们就不要把 reader.ReadToEnd() 给 Response.Write 出来,就可以了。

5、ASP.NET 抓取网页内容-保持登录状态

利用 Post 数据成功登录服务器应用系统后,就可以抓取需要登录的页面了,那么我们就可能需要在多个 Request 间保持登录状态。

首先,我们要使用 HttpWebRequest,而不是 WebRequest。

与 WebRequest 相比,变化的代码是:

[c-sharp] view plaincopy

  1. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl);

注意:HttpWebRequest.Create 返回的类型仍是 WebRequest,所以要转化一下。

其次,使用 CookieContainer。

[c-sharp] view plaincopy

  1. System.Net.CookieContainer cc = new System.Net.CookieContainer();
  2. request.CookieContainer = cc;
  3. request2.CookieContainer = cc;

这样 request 和 request2 之间就使用了相同的 Session,如果 request 登录了,那么 request2 也是登录状态。

最后,如何在不同的页面间使用同一个 CookieContainer。

要在不同的页面间使用同一个 CookieContainer,只有把 CookieContainer 加入 Session。

[c-sharp] view plaincopy

  1. Session.Add("ccc", cc); //存
  2. CookieContainer cc = (CookieContainer)Session["ccc"]; //取

如:

[c-sharp] view plaincopy

  1. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl);
  2. //同一页面
  3. //HttpWebRequest request2 = (HttpWebRequest)HttpWebRequest.Create(strUrl);
  4. //System.Net.CookieContainer cc = new CookieContainer();
  5. //request.CookieContainer = cc;
  6. //request2.CookieContainer = cc;
  7. //不同页面,具体使用时需要将request,request2分开
  8. object obj = Session["ccc"];
  9. if (obj == null)
  10. {
  11. CookieContainer cc = new CookieContainer();
  12. //requestr的保存
  13. Session.Add("ccc", cc);
  14. }
  15. string strUrl2 = "";
  16. HttpWebRequest request2 = (HttpWebRequest)HttpWebRequest.Create(strUrl2);
  17. //取出来
  18. CookieContainer cc2 = (CookieContainer)Session["ccc"];
  19. request2.CookieContainer = cc2;
  20. //再进行下一步处理

6、ASP.NET 抓取网页内容-把当前会话带到 WebRequest 中

比如说浏览器 B1 去访问服务器端 S1,这会产生一个会话,而服务器端 S2 再用 WebRequest 去访问服务器端 S1,这又会产生一个会话。现在的需求是让 WebRequest 使用浏览器 B1 与 S1 之间的会话,也就是说要让 S1 认为是 B1 在访问 S1,而不是 S2 在访问 S1。

这就要利用 Cookie 了,先在 S1 中取得与 B1 的 SessionID 的 Cookie,再将这个 Cookie 告诉 S2,S2 再将 Cookie 写在 WebRequest 中。

[c-sharp] view plaincopy

  1. WebRequest request = WebRequest.Create("url");
  2. request.Headers.Add(HttpRequestHeader.Cookie, "ASPSESSIONIDSCATBTAD=KNNDKCNBONBOOBIHHHHAOKDM;");
  3. WebResponse response = request.GetResponse();
  4. StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
  5. Response.Write(reader.ReadToEnd());
  6. reader.Close();
  7. reader.Dispose();
  8. response.Close();

要说明的是:

  • 本文并不是 Cookie 欺骗,因为 SessionID 是 S1 告诉 S2 的,并不是 S2 窃取的,虽然有些古怪,但这可能在一些特定的应用系统中会有用。
  • S1 必须要向 B1 写 Session,这样 SessionID 才会保存到 Cookie 中,并且 SessionID 才会保持不变。
  • 在 ASP.NET 中取 Cookie 用 Request.Cookies,本文假设 Cookie 已经取出来。
  • 不同的服务器端语言,SessionID 在 Cookie 中上名称并不一样,本文是 ASP 的 SessionID。
  • S1 可能不仅仅依靠 SessionID 来判断当前登录,它可能还会辅助于 Referer、User-Agent 等,这取决于 S1 端程序的设计。
  • 其实本文算是本连载中“保持登录状态”的另一种方法。

7、ASP.NET 抓取网页内容-如何更改来源 Referer 和 UserAgent

[c-sharp] view plaincopy

  1. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://127.0.0.1/index.htm");
  2. request.Referer = "http://www.csdn.net/";
  3. request.UserAgent = "要设置的标头";
  4. //下一步的处理

源:http://www.cftea.com/c/2008/07/B0AUNSSUA1NQCVIF.asp

时间: 2024-10-19 18:07:11

C# .net 抓取网页内容的相关文章

phpjquery抓取网页内容

phpquery抓取网页内容,以下都经过测试,不过phpquery你最好用我上传的,别的不保证,其实我也是下载的. include 'phpQuery/phpQuery.php'; /** phpQuery::newDocumentFile("http://www.helloweba.com/blog.html"); $artlist = pq(".blog_li"); foreach($artlist as $li){ echo pq($li)->find(

抓取网页内容并截图

需要调用windows.Forms命名空间,使用一个类库WebPreview1.1.rar_by_Kai.Ma,此处仅记录之. 给一个下载链接WebPreview1.1.rar_by_Kai.Ma.rar 抓取网页内容并截图,布布扣,bubuko.com

jsoup实现java抓取网页内容。

Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTML 中攫取你所需的信息和 扩展 HTMLParser 对自定义标签的处理能力.但现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了 jsoup . jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非

ASP.NET抓取网页内容的实现方法

这篇文章主要介绍了ASP.NET抓取网页内容的实现方法,涉及使用HttpWebRequest及WebResponse抓取网页内容的技巧,需要的朋友可以参考下 一.ASP.NET 使用HttpWebRequest抓取网页内容 /// <summary>方法一:比较推荐 /// 用HttpWebRequest取得网页源码 /// 对于带BOM的网页很有效,不管是什么编码都能正确识别 /// </summary> /// <param name="url">

perl 抓取网页内容

抓取乐彩网历年排列5数据 use LWP::Simple; use FileOperate;my $src = 'http://www.17500.cn/p5/all.php';my $FileOperate = FileOperate->new();my $FilePath = "C:\\Documents and Settings\\Administrator\\桌面\\PrelTest\\保存的模块\\文本处理";#获取文件夹下所有内容 #http://www.17500.

Asp 使用 Microsoft.XMLHTTP 抓取网页内容(没用乱码),并过滤需要的内容

Asp 使用 Microsoft.XMLHTTP 抓取网页内容,并过滤需要的内容 Asp 使用 Microsoft.XMLHTTP 抓取网页内容无乱码处理,并过滤需要的内容 示例源码: <% Dim xmlUrl,http,strHTML,strBody xmlUrl = Request.QueryString("u") REM 异步读取XML源 Set http = server.CreateObject("Microsoft.XMLHTTP") http.

shell命令curl抓取网页内容-下载xls文件

通过curl命令抓取网页内容,关键点如下: 1.curl要模拟浏览器,最好是有个代理,因为很多站点都会搞个反爬虫什么的. 2.我的需求很简单,就是在国家外汇管理局上下载各种货币对美元的汇率. http://www.safe.gov.cn/wps/portal/sy/tjsj_dmzsl 3.主要命令:curl,grep,awk,xls2txt,msql(LOAD DATA ). curl:提取url xls2txt:shell下的xls操作命令 xls2txt-0.14.tar.gz 下载地址:

ASP.NET抓取网页内容

原文:ASP.NET抓取网页内容 一.ASP.NET 使用HttpWebRequest抓取网页内容 这种方式抓取某些页面会失败 不过,有时候我们会发现,这个程序在抓取某些页面时,是获不到所需的内容的,有时候甚至返回404的错误提示页,这是什么原因呢? 其实,很多人都忽略了一个问题,那就是服务器默认的浏览器问题.有的服务器默认的浏览器是手机浏览器,那么,当我抓取这个服务器下的网页是,就相当于用手机浏览器来打开网页,而如果要抓取的目标网页没有相应的手机网页的话,就会返回意想不到的结果,有的返回404

CURL抓取网页内容

<?php $curl = curl_init();//初始化一个cURL对象 $url = "http://cart.jd.com/cart/cart.html?backurl=http://item.jd.com/176166.html&rid=0.9533184533 938766"; $header = array(); $header[] = 'User-Agent: 5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X