电竞比分网-中国电竞赛事及体育赛事平台

分享

WebBrowser抓圖示例——截取網(wǎng)頁(yè)上的驗(yàn)證碼圖片

 doc360sir 2011-10-31

  引言

  最近和一位朋友探討獲取WebBrowser訪問(wèn)的網(wǎng)頁(yè)中驗(yàn)證圖片的方法,起先想到的就是通過(guò)WebClient直接去下載當(dāng)前頁(yè)面中引用的驗(yàn)證碼圖片,但繼而想到這會(huì)涉及一些問(wèn)題:一是驗(yàn)證碼可能會(huì)在每次請(qǐng)求時(shí)都發(fā)生變化,二是將WebClient與WebBrowser的Cookies甚至 Session關(guān)聯(lián)起來(lái)是件很難的事。

  而后就想到了可以放棄WebBrowser,始終使用WebRequest進(jìn)行較為底層的訪問(wèn),以避免多次獲取驗(yàn)證碼產(chǎn)生變化導(dǎo)致不一致的情況,不過(guò)這種辦法操作起來(lái)還是比較復(fù)雜的。

  然后又想到這種變通的方法——抓圖。只需要直接通過(guò)WebBrowser截圖,并將驗(yàn)證碼以外的部分裁剪掉,就可以了。

  思路

  首先要分析一下那位朋友要獲取的驗(yàn)證圖片元素特征:

  網(wǎng)址:http://www./Charge/UCardDirectCharge.aspx?category=AAWYVVWYKV&product=AAWYVVWYKV010CV

  查看原圖(大圖) 

  這里很簡(jiǎn)單,我們只要找到src屬性為“RandomImage.aspx”結(jié)尾的圖片,就找到我們所需的這個(gè)元素了。

  找到這個(gè)元素之后,為了方便確定其位置,并確保其不會(huì)超出WebBrowser可視范圍,我們要為它賦予一個(gè)內(nèi)聯(lián)樣式,使之處于頁(yè)面的絕對(duì)左上角,并設(shè)置z-index為9999,以避免被其他元素覆蓋,這個(gè)樣式即為:

  "position: absolute; z-index: 9999; top: 0px; left: 0px"

  這之后就可以通過(guò)WebBrowser的DrawToBitmap方法截圖了,截圖的寬和高可通過(guò)上述元素的ClientRectangle屬性取得。

  實(shí)現(xiàn)

  那么現(xiàn)在建立一個(gè)WinForm項(xiàng)目來(lái)做測(cè)試,設(shè)計(jì)如下界面:

  然后為按鈕編寫(xiě)事件處理函數(shù):

雙擊代碼全選
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
private void button1_Click(object sender, 
EventArgs
 
e) 
 
{
    var wb = new 
WebBrowser
 
(); 
 
    //等待加載完畢
    while (wb.ReadyState < 
WebBrowserReadyState
 
.Complete) 
Application
 
.DoEvents(); 
 
    //遍歷尋找驗(yàn)證圖像所在元素
    foreach ( 
HtmlElement
 
f in wb.Document.Images) 
 
    {
        if (f.GetAttribute("src").ToLower().EndsWith("randomimage.aspx"))
        {
            //將元素絕對(duì)定位到頁(yè)面左上角
            f.Style = "position: absolute; z-index: 9999; top: 0px; left: 0px";
            //抓圖
            var b = new 
Bitmap
 
(f.ClientRectangle.Width, f.ClientRectangle.Height); 
 
            wb.DrawToBitmap(b, new 
Rectangle
 
(new 
Point
 
(), f.ClientRectangle.Size)); 
 
            pictureBox1.Image = b;
            break;
        }
    }
}

  編譯并運(yùn)行以測(cè)試:

  點(diǎn)擊按鈕,稍等片刻,即可在PictureBox中顯示出完整的驗(yàn)證碼圖片了。

  提示

  WebBrowser 的DrawToBitmap方法是隱藏的,不受智能感知提示支持,我不知道為什么會(huì)這樣,但我知道DrawToBitmap方法確實(shí)存在問(wèn)題,就是截圖出來(lái)全白現(xiàn)象,據(jù)我觀察,發(fā)生這種現(xiàn)象和是否顯示W(wǎng)ebBrowser控件有關(guān),只要在窗體上顯示了WebBrowser控件,截圖出來(lái)就是全白,而如果不將WebBrowser加載到窗體,截圖就是正常的,具體原因不明,只能再次感嘆WebBrowser這個(gè)強(qiáng)大的控件編寫(xiě)的也太粗濫了。

  結(jié)語(yǔ)

  總的來(lái)說(shuō)WebBrowser截圖還是很有意義的,透過(guò)它可以生成網(wǎng)頁(yè)抓圖,還有此例中演示的對(duì)特定元素抓圖,或者還可以變通地為Flash、XML、Txt之類的任何瀏覽器中可顯示的文件抓圖,在我前一段時(shí)間編寫(xiě)的AWWWB 網(wǎng)站克隆器中,就是使用了這種方式為Flash、Css、JS文件生成預(yù)覽圖的。

  出處:http://skyd.cnblogs.com/

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多