WebBrowser抓图示例——截取网页上的验证码图片

简介:

引言

最近和一位朋友探讨获取WebBrowser访问的网页中验证图片的方法,起先想到的就是通过WebClient直接去下载当前页面中引用的验证码图片,但继而想到这会涉及一些问题:一是验证码可能会在每次请求时都发生变化,二是将WebClient与WebBrowser的Cookies甚至Session关联起来是件很难的事。

而后就想到了可以放弃WebBrowser,始终使用WebRequest进行较为底层的访问,以避免多次获取验证码产生变化导致不一致的情况,不过这种办法操作起来还是比较复杂的。

然后又想到这种变通的方法——抓图。只需要直接通过WebBrowser截图,并将验证码以外的部分裁剪掉,就可以了。

 

思路

首先要分析一下那位朋友要获取的验证图片元素特征:

网址:http://www.jcard.cn/Charge/UCardDirectCharge.aspx?category=AAWYVVWYKV&product=AAWYVVWYKV010CV

image 

这里很简单,我们只要找到src属性为“RandomImage.aspx”结尾的图片,就找到我们所需的这个元素了。

找到这个元素之后,为了方便确定其位置,并确保其不会超出WebBrowser可视范围,我们要为它赋予一个内联样式,使之处于页面的绝对左上角,并设置z-index为9999,以避免被其他元素覆盖,这个样式即为:

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

这之后就可以通过WebBrowser的DrawToBitmap方法截图了,截图的宽和高可通过上述元素的ClientRectangle属性取得。

 

实现

那么现在建立一个WinForm项目来做测试,设计如下界面:

image

然后为按钮编写事件处理函数:

private void button1_Click(object sender, EventArgs e)

{

    var wb = new WebBrowser();

    wb.Navigate("http://www.jcard.cn/Charge/UCardDirectCharge.aspx?category=AAWYVVWYKV&product=AAWYVVWYKV010CV");

    //等待加载完毕

    while (wb.ReadyState < WebBrowserReadyState.Complete) Application.DoEvents();

    //遍历寻找验证图像所在元素

    foreach (HtmlElement f in wb.Document.Images)

    {

        if (f.GetAttribute("src").ToLower().EndsWith("randomimage.aspx"))

        {

            //将元素绝对定位到页面左上角

            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;

        }

    }

}

编译并运行以测试:

image

点击按钮,稍等片刻,即可在PictureBox中显示出完整的验证码图片了。

 

提示

WebBrowser的DrawToBitmap方法是隐藏的,不受智能感知提示支持,我不知道为什么会这样,但我知道DrawToBitmap方法确实存在问题,就是截图出来全白现象,据我观察,发生这种现象和是否显示WebBrowser控件有关,只要在窗体上显示了WebBrowser控件,截图出来就是全白,而如果不将WebBrowser加载到窗体,截图就是正常的,具体原因不明,只能再次感叹WebBrowser这个强大的控件编写的也太粗滥了。

 

结语

总的来说WebBrowser截图还是很有意义的,透过它可以生成网页抓图,还有此例中演示的对特定元素抓图,或者还可以变通地为Flash、XML、Txt之类的任何浏览器中可显示的文件抓图,在我前一段时间编写的AWWWB 网站克隆器中,就是使用了这种方式为Flash、Css、JS文件生成预览图的。

 

下载

范例代码:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/%E6%96%87%E6%A1%A3/VICtest20091210000943.rar

本文的XPS版本:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/%E6%96%87%E6%A1%A3/WebBrowser%E6%8A%93%E5%9B%BE%E7%A4%BA%E4%BE%8B%E2%80%94%E2%80%94%E6%88%AA%E5%8F%96%E7%BD%91%E9%A1%B5%E4%B8%8A%E7%9A%84%E9%AA%8C%E8%AF%81%E7%A0%81%E5%9B%BE%E7%89%87.xps


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2009/12/10/1620747.html,如需转载请自行联系原作者

相关文章
|
存储 算法 搜索推荐
时间复杂度:一步步理解算法效率
时间复杂度:一步步理解算法效率,更多文章可关注我的微信公众号:Python学习杂记
864 0
|
数据采集 机器学习/深度学习 安全
Python爬虫之极验滑动验证码的识别
了解极验滑动验证码、特点、识别思路、初始化、模拟点击、识别缺口、模拟拖动。
900 0
|
Python
python中使用update()方法
【6月更文挑战第16天】
279 7
|
存储 Linux 网络安全
都2023年了还不了解?使用FileZilla搭建信息文件服务器(Windows7)
都2023年了还不了解?使用FileZilla搭建信息文件服务器(Windows7)
1059 0
|
前端开发 JavaScript NoSQL
"从零到一:全方位解析现代Web开发技术栈
【7月更文挑战第9天】在当今快速发展的互联网时代,Web开发技术日新月异,为开发者提供了前所未有的创新空间。本文将从基础到高级,全面解析现代Web开发技术栈,帮助初学者或希望升级技能树的开发者构建稳固的知识体系。我们将探讨前端、后端以及全栈开发的关键技术,并通过一个简单的项目示例来演示这些技术的实际应用。
1552 1
|
监控 安全 网络安全
Windows系统安全深度解析:挑战、策略与全面防护
对敏感数据进行加密是保护数据机密性的重要手段。使用强加密算法对敏感数据进行加密存储和传输,即使数据被窃取也无法被轻易解密。此外,还可以考虑使用全磁盘加密技术来保护整个系统的数据安全性。
|
Kubernetes 调度 Perl
10分钟搞懂K8S的亲和与反亲和调度
首先来个一句话总结:亲和性调度就像关系亲密的闺蜜,你去哪儿我也去哪儿。反亲和性调度就像赌气的两个孩子,赌气永远不在一起玩儿。更多解释和实战详见下文。花10分钟看到最后,你肯定会有收获。
10分钟搞懂K8S的亲和与反亲和调度
|
人工智能 自然语言处理 知识图谱
Uni-Mol:分子3D表示学习框架和预训练模型项目原作解读
Uni-Mol:分子3D表示学习框架和预训练模型项目原作解读
440 0
|
Linux
17.3 【Linux】systemctl 针对 service 类型的配置文件
17.3 【Linux】systemctl 针对 service 类型的配置文件
219 0
|
存储 机器学习/深度学习 人工智能
加速开启“图智”未来,阿里云图数据库GDB V3引擎发布
随着互联网时代的快速发展,企业的数据呈现爆发式的增长,数据之间的关联也越来越复杂,图数据库应运而生。本次发布会将带你了解图数据库GDB的业务价值、典型应用场景,揭秘图数据库GDB V3引擎的设计原理、整体架构和核心数据结构,同时结合阿里巴巴集团内外部最佳实践,分享如何使用Graph + AI技术,分析各个数据源之间的关系特征,以及如何发现数据中的隐秘价值。
8490 1
加速开启“图智”未来,阿里云图数据库GDB V3引擎发布