C 抓取網頁內容的方法

2022-09-26 09:33:09 字數 4374 閱讀 6116

1、抓取一般內容

需要三個類:webrequest、webresponse、streamreader

所需命名空間:system.net、system.io

核心**:

view plaincopy to clipboardprint?

複製** **如下:

webrequest request = webrequest.create("");  

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?

複製** **如下:

抓取網頁內容 - 千一網路  

2 抓取網頁內容-

需要四個類:webrequest、webresponse、stream、filestream。

示例:view plaincopy to clipboardprint?

複製** **如下:

抓取網頁並儲存 - 千一網路  

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

using (streamreader reader = new streamreader(response.getresponsestream(), encoding.getencoding("gb2312")))  

4  抓取網頁內容-防止重定向

在抓取網頁時,成功登入伺服器應用系統後,應用系統可能會通過 response.redirect 將網頁進行重定向,如果不需要響應這個重定向,那麼,我們就不要把 reader.readtoend() 給 response.write 出來,就可以了。

5 抓取網頁內容-保持登入狀態

利用www.cppcns.com post 資料成功登入伺服器應用系統後,就可以抓取需要登入的頁面了,那麼我們就可能需要在多個 request 間保持登入狀態。

首先,我們要使用 httpwebrequest,而不是 webrequest。

與 webrequest 相比,變化的**是:

view plaincopy to clipboardprint?

複製** **如下:

注意: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?

複製** **如下:

要說明的是:

本文並不是 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?

複製** **如下:

""); // 錯誤   

= ""; // 錯誤   

request.referer = ""; // 正確 

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

view plaincopy to clipboardprint?

此標頭必須使用適當的屬性進行修改。  

引數名: name  

此標頭必須使用適當的屬性進行修改。引數名: name

useragent 類似。

本文標題: c# 抓取網頁內容的方法

本文位址:

C 抓取網頁內容的方法

1 抓取一般內容 需要三個類 webrequest webresponse streamreader 所需命名空間 system.net system.io 核心 view plaincopy to clipboardprint?如下 webrequest request webrequest.cr...

c 抓取網頁內容

新增的引用 using system.net using system.io using system.io.compression 1.webclient mywebclient new webclient mywebclient.credentials credentialcache.defau...

C 抓取網頁內容

1 抓取一般內容 需要三個類 webrequest webresponse streamreader 所需命名空間 system.net system.io 核心 webrequest request webrequest.create webresponse response request.ge...