C 抓取網頁內容

2021-09-30 10:12:07 字數 4055 閱讀 1563

1、抓取一般內容

需要三個類:webrequest、webresponse、streamreader

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

核心**:

webrequest request = webrequest.create(

"");  

webresponse response = request.getresponse();  

streamreader reader = 

newstreamreader(response.getresponsestream(), encoding.getencoding(

"gb2312"

));  

webrequest 類的 create 為靜態方法,引數為要抓取的網頁的**;

encoding 指定編碼,encoding 中有屬性 ascii、utf32、utf8 等全球通用的編碼,但沒有 gb2312 這個編碼屬性,所以我們使用 getencoding 獲得 gb2312 編碼。

示例:<%@ page language=

"c#"

%>  

<%@ import namespace=

"system.net"

%>  

<%@ import namespace=

"system.io"

%>  

"-//w3c//dtd xhtml 1.0 transitional//en"

"">  

"server"

"">  

2 抓取網頁內容-

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

示例:<%@ page language=

"c#"

%>  

<%@ import namespace=

"system.net"

%>  

<%@ import namespace=

"system.io"

%>  

"-//w3c//dtd xhtml 1.0 transitional//en"

"">  

"server"

"">  

3 抓取網頁內容-post 資料

在抓取網頁時,有時候,需要將某些資料通過 post 的方式傳送到伺服器,將以下**新增在網頁抓取的程式中,以實現將使用者名稱和密碼 post 到伺服器

string

data = 

"username=admin&passwd=admin888"

;  byte

requestbuffer = system.text.encoding.getencoding(

"gb2312"

).getbytes(data);  

request.method = 

"post"

;  request.contenttype = 

;  request.contentlength = requestbuffer.length;  

using

(stream requeststream = request.getrequeststream())  

using

(streamreader reader = 

newstreamreader(response.getresponsestream(), encoding.getencoding(

"gb2312"

)))    

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

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

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

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

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

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

注意:httpwebrequest.create 返回的型別仍是 webrequest,所以要轉化一下。

其次,使用 cookiecontainer。

view plain

copy to clipboard

print?

system.net.cookiecontainer cc = 

newsystem.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 中。

要說明的是:

6 抓取網頁內容-如何更改** referer 和 useragent

""); // 錯誤 

= ""; // 錯誤 

class

=caution>request.referer = 

""; // 正確  

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

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

引數名: name   

useragent 類似。

c 抓取網頁內容

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

網頁內容抓取

之前採用xpath和正規表示式對網頁內容進行抓取,發現在有的地方不如人意,就採用了htmlparser對頁面進行解析,抓取需要的東西。htmlparser有點不好的地方在於不能對starttag和endtag進行匹配。採用了兩種方法進行抓取。第一種,抓取成對的tag之間的內容,採用了queue.qu...

c 多執行緒抓取網頁內容

1.2.好了,認識 分析完問題,就是解決問題了 多執行緒在c 中並不難實現。它有乙個命名空間 system.threading 提供了多執行緒的支援。要開啟乙個新執行緒,需要以下的初始化 threadstart startdownload new threadstart download 執行緒起始...