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...