asp.net 抓取网页数据(ASP.NET中抓取网页内容是非常方便的())
优采云 发布时间: 2021-09-14 00:09asp.net 抓取网页数据(ASP.NET中抓取网页内容是非常方便的())
在ASP.NET中抓取网页内容非常方便,解决了ASP中困扰我们的编码问题。需要三个类:WebRequest、WebResponse、StreamReader。 WebRequest 和 WebResponse 的命名空间为: System.Net StreamReader 的命名空间为: System.IO 核心代码 WebRequest request = WebRequest.Create(""); WebResponse 响应 = request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")); WebRequest类的Create是一个静态方法,参数是要抓取的网页的URL; Encoding指定编码,Encoding有ASCII、UTF32、UTF8等属性编码,但是没有gb2312的encoding属性,所以我们使用GetEncoding来获取gb2312的编码。示例
ASP.NET 抓取网页内容-Post 数据抓取网页时,有时需要通过Post 向服务器发送一些数据。在网页抓取程序中加入如下代码,实现将用户名和密码发布到服务器: string data = "userName=admin&passwd=admin888"; byte[] requestBuffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data); request.Method = "POST"; request .ContentType = "application/x-www-form-urlencoded"; request.ContentLength = requestBuffer.Length;使用 (Stream requestStream = request.GetRequestStream()) {requestStream.Write(requestBuffer, 0, requestBuffer.Length);请求流。 Close();} using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"))) {string str = reader.ReadToEnd(); reader.Close();} 以上是编码以gb2312为例
ASP.NET 抓取网页内容阻止重定向。抓取网页时,在成功登录服务器应用系统后,应用系统可以通过Response.Redirect对网页进行重定向。如果不需要响应这个重定向,那么,我们不需要发送 reader.ReadToEnd() 到 Response.Write,就是这样。 ASP.NET 抓取网页内容保持登录状态使用Post数据成功登录服务器应用系统后,就可以抓取需要登录的页面,那么我们可能需要在多个Request中保持登录状态。首先,我们要使用 HttpWebRequest 而不是 WebRequest。与WebRequest相比,更改的代码为:HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);注意:HttpWebRequest.Create返回的类型仍然是WebRequest,所以转换一下。其次,使用CookieContainer。 System.Net.CookieContainer cc = new System.Net.CookieContainer(); request.CookieContainer = cc; request2.CookieContainer = cc;这样,request和request2之间使用了同一个Session。如果请求登录了,那么 request2 也登录了。
最后,如何在不同页面之间使用相同的CookieContainer。要在不同页面之间使用相同的 CookieContainer,只需将 CookieContainer 添加到 Session 中即可。 Session.Add("ccc", cc); //保存CookieContainer cc = (CookieContainer)Session["ccc"]; //获取ASP.NET并抓取网页内容——将当前会话带到WebRequest中,例如浏览器B1访问服务器端S1,这样会生成一个会话,服务器端S2会使用WebRequest访问服务器-side S1,它将生成一个会话。当前的要求是WebRequest 使用浏览器B1 和S1 之间的会话,这意味着S1 应该认为B1 正在访问S1,而不是S2 正在访问S1。这需要使用 cookie。首先在S1中获取SessionID为B1的Cookie,然后将这个Cookie告诉S2,S2将Cookie写入WebRequest中。 WebRequest request = WebRequest.Create("url"); request.Headers.Add(HttpRequestHeader.Cookie, "ASPSESSIONIDSCATBTAD=KNNDKCNBONBOOBIHHHHAOKDM;"); WebResponse 响应 = 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终端程序的设计。实际上,本文是本系列中另一种“保持登录”的方式。 ASP.NET抓取网页内容-如何更改源Referer和UserAgent ----------------------------------- - -------------------------------------------- HttpWebRequest 请求 = (HttpWebRequest ) HttpWebRequest.Create(""); //request.Headers.Add(HttpRequestHeader.Referer, ""); // 错误 //request.Headers[HttpRequestHeader.Referer] = ""; // 错误 request.Referer = "" ; // 正确注释掉的两句是错误的,会出现错误:这个header必须修改合适的属性。参数名称:名称 UserAgent 类似。