利用WebBrowser类实现超长网页的截图

简介:

在实际的工作中,有时我们需要对一些网页进行截图,一般的网页截图的代码如下(VB2010)

 

 

这段代码用到了辅助类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 
i
As Integer 

        Const 
WEB_HEIGHT As Integer = 10000 

        Using _Web As New
WebBrowser 
            
_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 _WebHeight
As Integer 
            If 
_Web.Document.Body
Is Nothing Then 
                
_WebHeight = 500 
           
Else 
                
_WebHeight = _Web.Document.Body.ScrollRectangle.Height 
           
End If 

            
_Bmp = New Bitmap(_Web.Width, _WebHeight) 
            Dim 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了。用之前的代码是无法实现截图的,而用改进后的代码就可以实现这点。

    本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2012/08/03/2621482.html,如需转载请自行联系原作者


相关文章
|
人工智能 程序员 测试技术
AI与Prompt:解锁软件开发团队的魔法咒语,在复杂任务上生成正确率更高的代码
AI与Prompt:解锁软件开发团队的魔法咒语,在复杂任务上生成正确率更高的代码
289 0
|
存储 Android开发 Python
使用 MitmProxy 自动抓取微信公众号阅读数、点赞和再看数据(一)
某天接到一个需要抓取某某微信公众的所有历史文章的阅读数、点赞和再看数据的需求。 为了解放双手,就用 Python 代码撸一个,选择 MitmProxy 代理作为抓包工具,因为它可以使用 Python 代码监听抓取到的 url,用于自动获取 cookie 等场景。
1955 0
使用 MitmProxy 自动抓取微信公众号阅读数、点赞和再看数据(一)
|
JavaScript 前端开发
JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
1463 0
|
7月前
|
人工智能 JavaScript 搜索推荐
宜搭融合 DeepSeek R1 满血版!手把手教你玩转低代码 AI 产品
AI技术的迅猛发展,特别是DeepSeek的推出,为企业带来了前所未有的智能化体验。当低代码平台与AI技术结合时,迸发出丰富的应用场景。本文详细介绍如何通过宜搭平台使用DeepSeek,涵盖网页版、AI助理版、AI生成组件、连接器等功能,帮助用户轻松实现智能化业务系统。
1278 7
宜搭融合 DeepSeek R1 满血版!手把手教你玩转低代码 AI 产品
|
7月前
|
人工智能 BI 自然语言处理
【瓴羊数据荟】 共话AI×Data的企业应用进化,瓴羊「数据荟」MeetUp城市行上海场顺利收官!
瓴羊「数据荟」Meet Up城市行系列活动第四期活动将于3月7日在上海举办,由中国信息通信研究院与阿里巴巴瓴羊专家联袂呈现,共同探讨AI时代的数据应用实践与企业智能DNA的革命性重构。
269 0
【瓴羊数据荟】  共话AI×Data的企业应用进化,瓴羊「数据荟」MeetUp城市行上海场顺利收官!
|
运维 Kubernetes 安全
K8s多集群管理:选对方法,为K8s集群赋能
阿里云容器服务团队在2019年推出注册集群,随着几年的发展,注册集群已经在多个行业和众多客户中应用,为K8s集群全面赋能,提供一站式的控制台体验,运维能力和云上弹性扩展能力,帮助您高效管理不同供应商和不同位置的K8s集群。
|
机器学习/深度学习 人工智能 API
薅羊毛!阿里云免费GPU云主机畅玩AI绘画,免费领取阿里云v100显卡搭建AI绘画利器Stable Diffusion
薅羊毛!阿里云免费GPU云主机畅玩AI绘画,免费领取阿里云v100显卡搭建AI绘画利器Stable Diffusion
1543 4
薅羊毛!阿里云免费GPU云主机畅玩AI绘画,免费领取阿里云v100显卡搭建AI绘画利器Stable Diffusion
|
弹性计算 Java 关系型数据库
分库分表比较推荐的方案
ShardingSphere 绝对可以说是当前分库分表的首选!ShardingSphere 的功能完善,除了支持读写分离和分库分表,还提供分布式事务、数据库治理等功能。另外,ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁
388 0
|
人工智能 自然语言处理 测试技术
通义灵码评测: 阿里云出品通义大模型AI代码编程辅助工具
通义灵码是阿里云出品的一款基于通义大模型的AI智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云 SDK/OpenAPI 的使用场景调优,助力开发者高效、流畅的编码。
1559 0
|
API
FreeRTOS入门教程(队列详细使用示例)
FreeRTOS入门教程(队列详细使用示例)
618 0

热门文章

最新文章