网站内容抓取(获取网页内容——保持登录状态利用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之间保持登录状态。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线