asp.net 抓取网页数据(获取网页内容——保持登录状态利用Post数据成功登录服务器应用系统)
优采云 发布时间: 2021-11-03 23:18asp.net 抓取网页数据(获取网页内容——保持登录状态利用Post数据成功登录服务器应用系统)
一、获取网页内容——html
在ASP.NET中抓取网页内容非常方便,解决了ASP中困扰我们的编码问题。
需要三个类:WebRequest、WebResponse、StreamReader。
WebRequest 和 WebResponse 的命名空间为:System.Net
StreamReader 的命名空间为:System.IO
核心代码
WebRequest request = WebRequest.Create("http://www.cftea.com/");
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
[1]WebRequest类的Create是一个静态方法,参数为要爬取的网页的URL;
[2]Encoding 指定编码。编码有ASCII、UTF32、UTF8等通用编码属性,但没有gb2312的编码属性,所以我们使用GetEncoding获取gb2312编码。
示例:
void Page_Load(object sender, EventArgs e)
{
try
{
WebRequest request = WebRequest.Create("http://www.baidu.com/");
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
tb.Text = reader.ReadToEnd();
reader.Close();
reader.Dispose();
response.Close();
}
catch (Exception ex)
{
tb.Text = ex.Message;
}
}
Demo
二、获取网页内容-图片(文档、压缩包等二进制文件)
不仅适用于图片,也适用于其他二进制文件。
需要四个类:WebRequest、WebResponse、Stream、FileStream。
WebRequest 和 WebResponse 的命名空间为:System.Net
Stream 和 FileStream 的命名空间为:System.IO
核心代码
WebRequest request = WebRequest.Create("http://www.baidu.com/images/logo.gif");
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();
注意类 Stream,而不是 StreamReader。
示例
void Page_Load(object sender, EventArgs e)
{
try
{
WebRequest request = WebRequest.Create("http://www.baidu.com/images/logo.gif");
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();
tb.Text = "保存成功!";
}
catch (Exception ex)
{
tb.Text = ex.Message;
}
}
Demo
三、获取网页内容-发布数据
在获取网页数据时,有时需要通过Post将一些数据发送到服务器。在网页爬虫程序中添加如下代码,将用户名和密码发布到服务器:
以上为gb2312编码示例:
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;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(requestBuffer, 0, requestBuffer.Length);
requestStream.Close();
}
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")))
{
string str = reader.ReadToEnd();
reader.Close();
}
四、获取网页内容阻止重定向
获取网页时,在成功登录服务器应用系统后,应用系统可以通过Response.Redirect对网页进行重定向。如果不需要响应这个重定向,那么我们不应该发送 reader.ReadToEnd() 到 Response。 .写出来,没问题。
五、获取网页内容-保持登录状态
使用Post数据成功登录服务器应用系统后,我们就可以抓取到需要登录的页面,那么我们可能需要在多个Request之间保持登录状态。