ASP.NET核心代码:用Stream读取3、网页内容POST

优采云 发布时间: 2021-06-17 01:42

  ASP.NET核心代码:用Stream读取3、网页内容POST

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

  1、抓取一般内容

  需要三个类:WebRequest、WebResponse、StreamReader

  必需的命名空间:System.Net、System.IO

  核心代码:

  WebRequest类的Create是一个静态方法,参数是要爬取的网页的URL;

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

  private string GetGeneralContent(string strUrl)

{

string strMsg = string.Empty;

try

{

WebRequest request = WebRequest.Create(strUrl);

WebResponse response = request.GetResponse();

StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));

strMsg = reader.ReadToEnd();

reader.Close();

reader.Dispose();

response.Close();

}

catch

{ }

return strMsg;

}

  2、 抓取图片或其他二进制文件(如文件)需要四个类:WebRequest、WebResponse、Stream、FileStream。所需命名空间:System.Net、System.IO 核心代码:Reading with Stream

  private string GetFileContent(string strUrl)

{

string strMsg = string.Empty;

try

{

WebRequest request = WebRequest.Create(strUrl);

WebResponse response = request.GetResponse();

Stream reader = response.GetResponseStream();

//可根据实际保存为具体文件

FileStream writer = new FileStream("D:\\logo.gif", FileMode.OpenOrCreate, FileAccess.Write);

byte[] buff = new byte[512];

int c = 0; //实际读取的字节数

while ((c=reader.Read(buff, 0, buff.Length)) > 0)

{

writer.Write(buff, 0, c);

}

writer.Close();

writer.Dispose();

reader.Close();

reader.Dispose();

response.Close();

strMsg = "保存成功";

}

catch

{ }

return strMsg;

}

  3、Grab 网页内容 POST 方式 抓取网页时,有时需要通过 Post 的方式向服务器发送一些数据。在网页抓取程序中加入如下代码,实现用户将用户名和密码发布到服务器:

  private string GetPostContent(string strUrl)

{

string strMsg = string.Empty;

try

{

string data = "userName=admin&passwd=admin888";

byte[] requestBuffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data);

WebRequest request = WebRequest.Create(strUrl);

request.Method = "POST";

request.ContentType = "application/x-www-form-urlencoded";

request.ContentLength = requestBuffer.Length;

using (Stream requestStream = request.GetRequestStream())

{

requestStream.Write(requestBuffer, 0, requestBuffer.Length);

requestStream.Close();

}

WebResponse response = request.GetResponse();

using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")))

{

strMsg = reader.ReadToEnd();

reader.Close();

}

}

catch

{ }

return strMsg;

}

  4、ASP.NET 捕获网页内容-防止重定向。在抓取网页时,在成功登录服务器应用系统后,应用系统可以通过Response.Redirect对网页进行重定向。如果你不需要响应这个重定向Orientation,那么,我们不把reader.ReadToEnd()给Response.Write,就是这样。 5、ASP.NET 抓取网页内容保持登录状态 使用Post数据成功登录服务器应用系统后,就可以抓取需要登录的页面了。那么我们可能需要在多个之间保持登录状态要求。首先,我们要使用 HttpWebRequest 而不是 WebRequest。与WebRequest相比,变化的代码是:

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

  注意:HttpWebRequest.Create返回的类型仍然是WebRequest,需要进行转换。二、使用CookieContainer。

  System.Net.CookieContainer cc = new System.Net.CookieContainer();

request.CookieContainer = cc;

request2.CookieContainer = cc;

  这样,request和request2之间使用了同一个Session。如果 request 已登录,则 request2 也已登录。

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

  不同页面之间要使用同一个CookieContainer,只需要在Session中添加CookieContainer即可。

  Session.Add("ccc", cc); //存

CookieContainer cc = (CookieContainer)Session["ccc"]; //取Session

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

  比如浏览器B1访问服务器端S1,这会产生一个会话,服务器端S2使用WebRequest访问服务器端S1,就会产生一个会话。当前要求WebRequest使用浏览器B1和S1之间的会话,这意味着S1应该认为B1正在访问S1,而不是S2正在访问S1。

  这就是cookies的使用。先在S1中获取SessionID为B1的Cookie,然后将这个Cookie告诉S2,S2将Cookie写入WebRequest中。

  WebRequest request = WebRequest.Create("url");

request.Headers.Add(HttpRequestHeader.Cookie, "ASPSESSIONIDSCATBTAD=KNNDKCNBONBOOBIHHHHAOKDM;");

WebResponse response = request.GetResponse();

StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));

Response.Write(reader.ReadToEnd());

reader.Close();

reader.Dispose();

response.Close();

  我想解释一下:

  本文不是 Cookie 欺骗,因为 SessionID 是 S1 告诉 S2 的,并没有被 S2 窃取。虽然有点奇怪,但在某些特定的应用系统中可能会有用。

  S1 必须将 Session 写入 B1,这样 SessionID 将保存在 Cookie 中,SessionID 将保持不变。

  Request.Cookies 用于在 ASP.NET 中获取 cookie。本文假设已获取 cookie。

  不同的服务器端语言对Cookie中的SessionID有不同的名称。本文为ASP SessionID。

  S1 可能不仅依赖 SessionID 来确定当前登录,还可能辅助 Referer、User-Agent 等,具体取决于 S1 终端程序的设计。

  这篇文章其实是本系列中另一种“保持登录”的方式。

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

  HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://127.0.0.1/index.htm");

request.Referer = "http://www.csdn.net/";

request.UserAgent = "要设置的标头";

//下一步的处理

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线