ASP.NET核心代码:用Stream读取3、网页内容POST
优采云 发布时间: 2021-06-17 01:42ASP.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 = "要设置的标头";
//下一步的处理