WebBrowser截取网页上的验证码图片

   引言

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

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

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

  思路

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

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


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

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

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

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

  实现

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


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

  privatevoid button1_Click(object sender, EventArgs e)

  {

  var wb =newWebBrowser();

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

  //等待加载完毕

  while (wb.ReadyState

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

  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 =newBitmap(f.ClientRectangle.Width, f.ClientRectangle.Height);

  wb.DrawToBitmap(b, newRectangle(newPoint(), f.ClientRectangle.Size));

  pictureBox1.Image = b;

  break;

  }

  }

  }

  编译并运行以测试:


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

  提示

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

时间: 2024-11-05 12:31:39

WebBrowser截取网页上的验证码图片的相关文章

网页采集-求c#用webbrowser采集网页上的动态内容

问题描述 求c#用webbrowser采集网页上的动态内容 求c#用webbrowser采集网页上的动态内容采集到EXCEL上,小弟新手,麻烦大大可以给点思路,或者代码哈,不胜感激 解决方案 http://blog.csdn.net/jintougao/article/details/12948633http://blog.163.com/wei_jia192@126/blog/static/9837925020103161001450/

获取网页上的验证码

问题描述 怎么可以获取打开的网页中获取验证码?请把实现的代码贴上我在这里万分的感谢! 解决方案 解决方案二:这就和如何打开防盗门一样.防盗门就是防止小偷轻易打开的.如果一个验证码可以被机器模拟程序轻易识别,那么这个验证码的设计就是失败的.解决方案三:楼主只是说获取没有所识别吧获取的话很简单一般的验证码都提供点击更换验证码功能这个时候你看一下他请求的地址就ok了那个地址就是验证码解决方案四:"那个地址"是一个动态变动的图片吧?!也就是说同一个地址,每一次访问可能就是不同的图片内容了.地址

如何在网页上生成验证码?

在平时的网站的注册和登录的时候我们经常会遇到要填写验证码的情况,验证码的存在是保护网站系统的一个良好的方式,今天我就来谈一谈我生成验证码的一些心得. 整体的使用思路: 首先在Servlet的doGet方法中设置响应头的内容response.setHeader("Content-type", "image/jpeg");这是针对于图片信息的特有的方式. 创建一个缓冲的图片流 配置一些必要的参数,如字体,画笔等 调用ImageIO的write方法,并发送给客户端生成的图

小爬虫-一个网页上的.jpg图片下载下来

import re import urllib def getHtml(html): page = urllib.urlopen(html) Html = page.read() return Html def getImg(Html): r = r'src="(.*?\.jpg)"' #正则r用来筛选图片的地址 img_re = re.compile(r) imgHtml = re.findall(img_re, Html) x = 0 for imght in imgHtml: u

java如何实现QQ在网页上在线和下线的不同表示

问题描述 我想实现在网页上的在线QQ问答,能不能我的QQ上线时网页上的QQ图片显示的是在线图标,而我下线时QQ图片变暗,显示下线图片 解决方案 解决方案二:用java的话用两张图片解决方案三:能判断出qq的状态就可以了根据不同的状态显示不同的图片解决方案四:是啊,我也知道要判断出QQ的状态啊,但是我不知道怎么判断,怎么获取啊,解决方案五:n年前腾讯已经提供这个功能了,去查一下吧解决方案六:看一下吧..QQ专门有这功能.去找一下吧..好久了忘记什么网址去了.解决方案七:用到了session的监听器

Word2010过滤网页上的超链接和图片方法

  我们时常会在某些网站上找一些自己想要的资料,但是许多网站上都有各种各样的格式.超链接.图片等,复制到Word里面后你会发现连同这些样式全部都粘贴到文档里面了.我们要的纯文本形式的,如果手工去除这些样式工作量可不小,而且又麻烦.怎样可以直接复制网页里面的内容时只粘贴纯文本到文档中,而且都将这些超链接.图片等样式全部过滤掉呢?下面就来为大家详解操作吧! Word2010过滤网页上的超链接和图片方法: 方法一:先复制网页上带样式的内容,然后进入Word2010界面,单击左上角的"粘贴"箭

求android大神说说为什么我这样获取不到网页验证码图片?

问题描述 求android大神说说为什么我这样获取不到网页验证码图片? 求android大神说说为什么我这样获取不到网页验证码图片? HttpPost httpPost = new HttpPost(""cas.gzccc.edu.cn/lyuapServer/captcha.htm""); HttpResponse httpResponse = client.execute(httpPost); COOKIE = ((AbstractHttpClient) cli

编码-django取出pymongo中存储的中文图片路径后,读取该路径在网页上展示没有出现图片

问题描述 django取出pymongo中存储的中文图片路径后,读取该路径在网页上展示没有出现图片 问题是这样的: 我搭建的环境是:python2.7 + mongoengine + pymongo + django + Ubuntu14 python处理一些带有中文路径的图片,把这个路径存储在数据库pymongo中,保存的时候该路径是转换为:utf-8类型存储到数据库中,然后django通过mongoengine来连接pymongo的数据库,从中取出这个图片的路径, 希望向各位朋友们请教一下下

Python获取网页上图片下载地址的方法_python

本文实例讲述了Python获取网页上图片下载地址的方法.分享给大家供大家参考.具体如下: 这里获取网页上图片的下载地址是正在写的数据采集中的一段,代码如下: 复制代码 代码如下: #!/user/bin/python3 import urllib2 from HTMLParser import HTMLParser class MyHtmlParser(HTMLParser):     links = []     def handle_starttag(self, tag, attrs):