网站内容抓取(获取网页内容——保持登录状态利用Post数据成功登录服务器应用系统)
优采云 发布时间: 2022-02-19 07:13网站内容抓取(获取网页内容——保持登录状态利用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指定编码,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发送到服务器,在网页爬取程序中加入如下代码,将用户名和密码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之间保持登录状态。