asp.net 抓取网页数据(ASP.NET中抓取网页内容-防止重定向在网页时保持登录状态 )

优采云 发布时间: 2022-03-14 19:13

  asp.net 抓取网页数据(ASP.NET中抓取网页内容-防止重定向在网页时保持登录状态

)

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

  1、获取一般内容

  需要三个类:WebRequest、WebResponse、StreamReader

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

  核心代码:

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

  Encoding指定编码,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 核心代码:用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、抓取网页内容POST方式在抓取网页时,有时需要通过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重定向网页,如果不需要响应这个重定向,那么,我们不需要将 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,只需将CookieContainer添加到Session中即可。

  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会在WebRequest中写入cookie。

  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();

  据说:

  本文不是cookiespoofing,因为SessionID是S1告诉S2的,不是S2偷的,虽然有点奇怪,但在某些特定的应用系统中可能有用。

  S1 必须将 Session 写入 B1,这样 SessionID 才会保存到 cookie 中,SessionID 保持不变。

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

  服务器端语言不同,cookie中的SessionID名称不一样,本文为ASP的SessionID。

  S1可能不仅仅依靠SessionID判断当前登录,还可能辅助Referer、User-Agent等,这取决于S1端程序的设计。

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

  7、ASP.NET Crawl Web Content - 如何更改 Source 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人工客服


线