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 執行緒起始...