利用WebBrowser類實現超長網頁的截圖

來源:互聯網
上載者:User

在實際的工作中,有時我們需要對一些網頁進行,一般的網頁的代碼如下(VB2010)

 


    Private Shared Function CaptureWeb(Settings As Object) As Object        Dim _Settings As clsCaptureSettings = CType(Settings, clsCaptureSettings)        Dim _Bmp As Bitmap = Nothing        Using _Web As New WebBrowser            _Web.ScrollBarsEnabled = False            _Web.Width = _Settings.Width            Dim _Time As Date = Now.AddSeconds(_Settings.TimeOut)            _Web.Navigate(_Settings.Url)            Do Until (_Web.ReadyState = WebBrowserReadyState.Complete) OrElse (Now > _Time)                Application.DoEvents()            Loop            _Web.Stop()            If _Web.Document.Body Is Nothing Then                _Web.Height = 40            Else                _Web.Height = _Web.Document.Body.ScrollRectangle.Height            End If            _Bmp = New Bitmap(_Web.Width, _Web.Height)            Dim R As Rectangle = New Rectangle(0, 0, _Web.Width, _Web.Height)            _Web.DrawToBitmap(_Bmp, R)        End Using        Return _Bmp    End Function

 

這段代碼用到了輔助類clsCaptureSettings。這個類有3個欄位:Url:要訪問的網頁的地址;Width:要的寬度,預設是1024;TimeOut:逾時設定,預設是180秒;

以上代碼實現的關鍵就是兩句話

_Web.Height = _Web.Document.Body.ScrollRectangle.Height

把WebBrowser的高度設定和網頁高度一致

_Web.DrawToBitmap(_Bmp, R)

將WebBrowser類中的內容畫到位元影像對象

 

上面的代碼經測試,會有如下的兩個問題

1、當WebBrowser的高度設定超過20000(是個約數,沒有仔細測量過)時,DrawToBitmap方法會有一定幾率失效,沒法完成。而且,WebBrowser的高度越大,失效的幾率越大。

2、WebBrowser的高度也不是能無限設定的,其上限是65536,超過這個上限的時候,Webbrowser類會自動化佈建高度為65536,而當高度設定為65536時,DrawToBitmap方法失效的幾率幾乎是100%

 

這樣,上面的代碼在截取超長網頁的時候就會出現問題,幾乎不能完成網頁的。

 

於是,需要改動代碼。利用滾屏實現網頁。

實現滾屏的技術痛點在於,一是如何通過代碼滾動網頁?通過查閱資料,用如下的代碼即可。

_Web.Document.Window.Parent.ScrollTo(X, Y)

該代碼將網頁滾動到水平X,垂直Y的位置。

 

二是,如何獲得當前網頁滾動的垂直位置?代碼如下:

_Web.Document.Body.Parent.ScrollTop

 

因此,改進後的代碼如下:

 

    Private Shared Function CaptureWeb(Settings As Object)As Object

        Dim _Settings As clsCaptureSettings = CType(Settings, clsCaptureSettings)

        Dim _Bmp As Bitmap =Nothing

        Dim iAs Integer

        Const WEB_HEIGHT As Integer = 10000

        Using _Web As NewWebBrowser

            _Web.ScrollBarsEnabled =False

            _Web.Width = _Settings.Width

            _Web.Height = WEB_HEIGHT

            Dim _Time As Date = Now.AddSeconds(_Settings.TimeOut)

            _Web.Navigate(_Settings.Url)

            Do Until (_Web.ReadyState = WebBrowserReadyState.Complete) OrElse (Now > _Time)

                Application.DoEvents()

           Loop

            _Web.Stop()

            Dim _WebHeightAs Integer

            If _Web.Document.BodyIs Nothing Then

                _WebHeight = 500

           Else

                _WebHeight = _Web.Document.Body.ScrollRectangle.Height

           End If

            _Bmp = New Bitmap(_Web.Width, _WebHeight)

            Dim R As Rectangle = New Rectangle(0, 0, _Web.Width, WEB_HEIGHT)

            For i = 0 To _WebHeight - 1 Step WEB_HEIGHT

                _Web.Document.Window.Parent.ScrollTo(0, i)

                If _Web.Document.Body.Parent.ScrollTop = i Then

                    _Web.DrawToBitmap(_Bmp, R)

                    R.Offset(0, WEB_HEIGHT)

               Else

                    R.Y = _Web.Document.Body.Parent.ScrollTop

                    _Web.DrawToBitmap(_Bmp, R)

               End If

            Next

        End Using

        Return _Bmp

   End Function

 

此改進後的代碼相較之前的代碼增加了滾動網頁的代碼,因此在截相同的網頁的時候,效率會差點,但是可能截一些超長網頁。

什麼地方會出線超長網頁?很多大家不注意的地方,那就是論壇,一般論壇都是主題一個,每頁的回複數是30個。這樣,很容易整個網頁的長度就超過65536了。用之前的代碼是無法實現的,而用改進後的代碼就可以實現這點。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.