a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

C# 抓取網頁內容的方法

2020-01-24 03:24:26
字體:
來源:轉載
供稿:網友

1、抓取一般內容

需要三個類:WebRequest、WebResponse、StreamReader

所需命名空間:System.Net、System.IO

核心代碼:

view plaincopy to clipboardprint?

復制代碼 代碼如下:

WebRequest request = WebRequest.Create("http://www.5lwq4hdr.cn/");  
WebResponse response = request.GetResponse();  
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")); 


WebRequest 類的 Create 為靜態方法,參數為要抓取的網頁的網址;

      Encoding 指定編碼,Encoding 中有屬性 ASCII、UTF32、UTF8 等全球通用的編碼,但沒有 gb2312 這個編碼屬性,所以我們使用 GetEncoding 獲得 gb2312 編碼。

示例:

view plaincopy to clipboardprint?

復制代碼 代碼如下:

<%@ Page Language="C#" %>  
<%@ Import Namespace="System.Net" %>  
<%@ Import Namespace="System.IO" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<mce:script runat="server"><!--  
    void Page_Load(object sender, EventArgs e)  
    {  
        try  
        {  
            WebRequest request = WebRequest.Create("http://www.5lwq4hdr.cn/");  
            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;  
        }  
    }  
// --></mce:script>   
<html xmlns="http://www.w3.org/1999/xhtml" >  
<head runat="server">  
    <title>抓取網頁內容 - 千一網絡</title>  
</head>  
<body>  
    <form id="form1" runat="server">  
    <div>  
    <asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox>  
    </div>  
    </form>  
</body>  
</html> 


2 抓取網頁內容-圖片

    需要四個類:WebRequest、WebResponse、Stream、FileStream。

   示例:

view plaincopy to clipboardprint?

復制代碼 代碼如下:

<%@ Page Language="C#" %>  
<%@ Import Namespace="System.Net" %>  
<%@ Import Namespace="System.IO" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<mce:script runat="server"><!--  
    void Page_Load(object sender, EventArgs e)  
    {  
        try  
        {  
            WebRequest request = WebRequest.Create("http://www.5lwq4hdr.cn/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;  
        }  
    }  
// --></mce:script>   
<html xmlns="http://www.w3.org/1999/xhtml" >  
<head runat="server">  
    <title>抓取網頁圖片并保存 - 千一網絡</title>  
</head>  
<body>  
    <form id="form1" runat="server">  
    <div>  
    <asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox>  
    </div>  
    </form>  
</body>  
</html> 


3 抓取網頁內容-Post 數據

   在抓取網頁時,有時候,需要將某些數據通過 Post 的方式發送到服務器,將以下代碼添加在網頁抓取的程序中,以實現將用戶名和密碼 Post 到服務器

view plaincopy to clipboardprint?

復制代碼 代碼如下:

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 相比,變化的代碼是:

view plaincopy to clipboardprint?

復制代碼 代碼如下:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 


注意:HttpWebRequest.Create 返回的類型仍是 WebRequest,所以要轉化一下。

其次,使用 CookieContainer。

view plaincopy to clipboardprint?

復制代碼 代碼如下:

System.Net.CookieContainer cc = new System.Net.CookieContainer();  
request.CookieContainer = cc;  
request2.CookieContainer = cc;  


這樣 request 和 request2 之間就使用了相同的 Session,如果 request 登錄了,那么 request2 也是登錄狀態。

最后,如何在不同的頁面間使用同一個 CookieContainer。

要在不同的頁面間使用同一個 CookieContainer,只有把 CookieContainer 加入 Session。

復制代碼 代碼如下:

view plaincopy to clipboardprint?
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 中。

view plaincopy to clipboardprint?

復制代碼 代碼如下:

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(); 

要說明的是:

本文并不是 Cookie 欺騙,因為 SessionID 是 S1 告訴 S2 的,并不是 S2 竊取的,雖然有些古怪,但這可能在一些特定的應用系統中會有用。
S1 必須要向 B1 寫 Session,這樣 SessionID 才會保存到 Cookie 中,并且 SessionID 才會保持不變。
在 ASP.NET 中取 Cookie 用 Request.Cookies,本文假設 Cookie 已經取出來。
不同的服務器端語言,SessionID 在 Cookie 中上名稱并不一樣,本文是 ASP 的 SessionID。
S1 可能不僅僅依靠 SessionID 來判斷當前登錄,它可能還會輔助于 Referer、User-Agent 等,這取決于 S1 端程序的設計。
其實本文算是本連載中“保持登錄狀態”的另一種方法。
6 抓取網頁內容-如何更改來源 Referer 和 UserAgent

view plaincopy to clipboardprint?

復制代碼 代碼如下:

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.5lwq4hdr.cn/"); // 錯誤   
//request.Headers[HttpRequestHeader.Referer] = "http://www.5lwq4hdr.cn/"; // 錯誤   
<SPAN class=caution>request.Referer</SPAN> = "http://www.5lwq4hdr.cn/"; // 正確 


注釋掉的兩句是不對的,會發生錯誤:

view plaincopy to clipboardprint?
此標頭必須使用適當的屬性進行修改。  
參數名: name  
此標頭必須使用適當的屬性進行修改。參數名: name

UserAgent 類似。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 超碰在线99| 欧美影片| 亚洲一区中文字幕 | 色a在线 | 国精品产品区三区 | 一区二区精品 | 最新伦理片 | 日韩精品一区二区三区中文在线 | 国产精品美女在线观看直播 | 日本理论片好看理论片 | 免费一二二区视频 | 中文字幕乱码亚洲精品一区 | 日韩一区二区三区av | 美女又黄又免费 | 亚洲视频在线观看免费 | 国产激情在线 | 成人免费淫片aa视频免费 | 91在线高清观看 | 五月婷婷在线视频 | 国产中文区二幕区2012 | 人人草天天草 | 最新黄色网址在线播放 | 亚洲欧美日韩天堂 | www.788.com色淫免费 | 久久合| 国产无套一区二区三区久久 | 国产精品第一区第27页 | 91精品久久久久久综合五月天 | 欧美性猛交一区二区三区精品 | www.久久久 | 中文字幕一级 | 欧美午夜精品久久久久免费视 | 91 视频网站 | 国产综合精品一区二区三区 | 欧洲毛片基地 | 久久激情视频 | 亚洲九九精品 | 91视频免费污 | av性色 | 成人国产精品久久久 | 日韩欧美一级二级 |