asp.net 抓取网页数据(ASP.NET中抓取网页内容-防止重定向在网页时保持登录状态 )
优采云 发布时间: 2022-03-14 19:13asp.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 = "要设置的标头";
//下一步的处理