标签:
1、抓取一般内容
需要三个类:WebRequest、WebResponse、StreamReader
所需命名空间:System.Net、System.IO
核心代码:
1 WebRequest request = WebRequest.Create("http://www.cftea.com/"); 2 WebResponse response = request.GetResponse(); 3 StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
WebRequest 类的 Create 为静态方法,参数为要抓取的网页的网址;
Encoding 指定编码,Encoding 中有属性 ASCII、UTF32、UTF8 等全球通用的编码,但没有 gb2312 这个编码属性,所以我们使用 GetEncoding 获得 gb2312 编码。
示例:
1 <%@ Page Language="C#" %> 2 <%@ Import Namespace="System.Net" %> 3 <%@ Import Namespace="System.IO" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 5 <mce:script runat="server"><!-- 6 void Page_Load(object sender, EventArgs e) 7 { 8 try 9 { 10 WebRequest request = WebRequest.Create("http://www.cftea.com/"); 11 WebResponse response = request.GetResponse(); 12 StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")); 13 14 tb.Text = reader.ReadToEnd(); 15 16 reader.Close(); 17 reader.Dispose(); 18 response.Close(); 19 } 20 catch (Exception ex) 21 { 22 tb.Text = ex.Message; 23 } 24 } 25 // --></mce:script> 26 <html xmlns="http://www.w3.org/1999/xhtml" > 27 <head runat="server"> 28 <title>抓取网页内容 - 千一网络</title> 29 </head> 30 <body> 31 <form id="form1" runat="server"> 32 <div> 33 <asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox> 34 </div> 35 </form> 36 </body> 37 </html>
2 抓取网页内容-图片
需要四个类:WebRequest、WebResponse、Stream、FileStream。
示例:
1 <%@ Page Language="C#" %> 2 <%@ Import Namespace="System.Net" %> 3 <%@ Import Namespace="System.IO" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 5 <mce:script runat="server"><!-- 6 void Page_Load(object sender, EventArgs e) 7 { 8 try 9 { 10 WebRequest request = WebRequest.Create("http://www.cftea.com/images/logo.gif"); 11 WebResponse response = request.GetResponse(); 12 Stream reader = response.GetResponseStream(); 13 14 FileStream writer = new FileStream("D://logo.gif", FileMode.OpenOrCreate, FileAccess.Write); 15 byte[] buff = new byte[512]; 16 int c = 0; //实际读取的字节数 17 while ((c=reader.Read(buff, 0, buff.Length)) > 0) 18 { 19 writer.Write(buff, 0, c); 20 } 21 writer.Close(); 22 writer.Dispose(); 23 24 reader.Close(); 25 reader.Dispose(); 26 response.Close(); 27 28 tb.Text = "保存成功!"; 29 } 30 catch (Exception ex) 31 { 32 tb.Text = ex.Message; 33 } 34 } 35 // --></mce:script> 36 <html xmlns="http://www.w3.org/1999/xhtml" > 37 <head runat="server"> 38 <title>抓取网页图片并保存 - 千一网络</title> 39 </head> 40 <body> 41 <form id="form1" runat="server"> 42 <div> 43 <asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox> 44 </div> 45 </form> 46 </body> 47 </html>
3 抓取网页内容-Post 数据
在抓取网页时,有时候,需要将某些数据通过 Post 的方式发送到服务器,将以下代码添加在网页抓取的程序中,以实现将用户名和密码 Post 到服务器
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(); }
4 抓取网页内容-防止重定向
在抓取网页时,成功登录服务器应用系统后,应用系统可能会通过 Response.Redirect 将网页进行重定向,如果不需要响应这个重定向,那么,我们就不要把 reader.ReadToEnd() 给 Response.Write 出来,就可以了。
5 抓取网页内容-保持登录状态
利用 Post 数据成功登录服务器应用系统后,就可以抓取需要登录的页面了,那么我们就可能需要在多个 Request 间保持登录状态。
首先,我们要使用 HttpWebRequest,而不是 WebRequest。
与 WebRequest 相比,变化的代码是:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
注意: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"]; //取
5 抓取网页内容-把当前会话带到 WebRequest 中
比如说浏览器 B1 去访问服务器端 S1,这会产生一个会话,而服务器端 S2 再用 WebRequest 去访问服务器端 S1,这又会产生一个会话。现在的需求是让 WebRequest 使用浏览器 B1 与 S1 之间的会话,也就是说要让 S1 认为是 B1 在访问 S1,而不是 S2 在访问 S1。
这就要利用 Cookie 了,先在 S1 中取得与 B1 的 SessionID 的 Cookie,再将这个 Cookie 告诉 S2,S2 再将 Cookie 写在 WebRequest 中。
WebRequest request = WebRequest.Create("url"); <SPAN class=key>request.Headers.Add(HttpRequestHeader.Cookie, "ASPSESSIONIDSCATBTAD=KNNDKCNBONBOOBIHHHHAOKDM;");</SPAN> 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();
要说明的是:
6 抓取网页内容-如何更改来源 Referer 和 UserAgent
<SPAN class=caution>HttpWebRequest</SPAN> request = <SPAN class=caution>(HttpWebRequest)HttpWebRequest</SPAN>.Create("http://127.0.0.1/index.htm"); //request.Headers.Add(HttpRequestHeader.Referer, "http://www.cftea.com/"); // 错误 //request.Headers[HttpRequestHeader.Referer] = "http://www.cftea.com/"; // 错误 <SPAN class=caution>request.Referer</SPAN> = "http://www.cftea.com/"; // 正确
注释掉的两句是不对的,会发生错误:
标签:
原文地址:http://www.cnblogs.com/AlexZha/p/5726905.html