有97%新玩家认为python识别验证码的思路()值得一读!

{image}

4条解答

一.python抓取网页时是如何处理验证码的

python抓取网页时是如何处理验证码的?下面给大家介绍几种方法:

1 、输入式验证码

这种验证码主要是通过用户输入图片中的字母 、数字、汉字等进行验证。如下图:

解决思路:这种是最简单的一种 ,只要识别出里面的内容 ,然后填入到输入框中即可 。这种识别技术叫OCR,这里我们推荐使用Python的第三方库,tesserocr 。对于没有什么背影影响的验证码如图2 ,直接通过这个库来识别就可以。但是对于有嘈杂的背景的验证码这种,直接识别识别率会很低,遇到这种我们就得需要先处理一下图片 ,先对图片进行灰度化,然后再进行二值化,再去识别 ,这样识别率会大大提高。

相关推荐:《Python入门教程》

2、滑动式验证码

这种是将备选碎片直线滑动到正确的位置,如下图:

解决思路:对于这种侍蔽验证码就比较复杂一点,但也是有相应的办法 。我们直接想到的就是模拟人去拖动验证码的行为 ,点击按钮,然后看到了缺口的位置,最后把拼图拖到缺口位置处完成验证。

第一步:点击按钮。然后我们发现 ,在你没有点击按钮的时候段镇那个缺口和拼图是没有出现的 ,点击后才出现,这为我们找到缺口的位置提供了灵感 。

第二步:拖到缺口位置。

我们知道拼图应该拖到缺口处,但是这个距离老燃州如果用数值来表示?

通过我们第一步观察到的现象 ,我们可以找到缺口的位置。这里我们可以比较两张图的像素,设置一个基准值,如果某个位置的差值超过了基准值 ,那我们就找到了这两张图片不一样的位置,当然我们是从那块拼图的右侧开始并且从左到右,找到第一个不一样的位置时就结束 ,这是的位置应该是缺口的left,所以我们使用selenium拖到这个位置即可 。

这里还有个疑问就是如何能自动的保存这两张图?

这里我们可以先找到这个标签,然后获取它的location和size ,然后 top,bottom,left ,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width'] ,然后截图 ,最后抠图填入这四个位置就行。

具体的使用可以查看selenium文档,点击按钮前抠张图,点击后再抠张图。最后拖动的时候要需要模拟人的行为 ,先加速然后减速 。因为这种验证码有行为特征检测,人是不可能做到一直匀速的,否则它就判定为是机器在拖动 ,这样就无法通过验证了。

3 、点击式的图文验证和图标选择

图文验证:通过文字提醒用户点击图中相同字的位置进行验证。

图标选择: 给出一组图片,按要求点击其中一张或者多张 。借用万物识别的难度阻挡机器 。

这两种原理相似,只不过是一个是给出文字 ,点击图片中的文字,一个是给出图片,点出内容相同的图片。

这两种没有特别好的方法 ,只能借助第三方识别接口来识别出相同的内容,推荐一个超级鹰,把验证码发过去 ,会返回相应的点击坐标。

然后再使用selenium模拟点击即可 。具体怎么获取图片和上面方法一样。

4、宫格验证码

这种就很棘手 ,每一次出现的都不一样,但是也会出现一样的。而且拖动顺序都不一样 。

但是我们发现不一样的验证码个数是有限的,这里采用模版匹配的方法。我觉得就好像暴力枚举 ,把所有出现的验证码保存下来,然后挑出不一样的验证码,按照拖动顺序命名 ,我们从左到右上下到下,设为1,2 ,3,4。上图的滑动顺序为4,3 ,2,1,所以我们命名4_3_2_ ,这里得手动搞 。当验证码出现的时候 ,用我们保存的图片一一枚举,与出现这种比较像素,方法见上面。如果匹配上了 ,拖动顺序就为4,3,2 ,1。然后使用selenium模拟即可 。

二.python3 使用selenium过程中遇到验证码请问如何识别验证码 搜

其实cookie最终都放到header里面的。 自己登陆一次后,再刷新一下首页就能看到requests里面的header里有cookie字段了。 所以直接加到header也行 。大家在使用qtp进行自动化测试的过程中经常会遇到图片验证码的问题——大家所关心的就是如何解决此类问题 。 这里我们首先要去了解为什么会有图片验证码。其实验证码的本质作用就是防止有人利用工具(灌水机、注册机,当然也不小心包括了我们的自动化测试工具)恶意猜解登陆或者不停的注册和灌水的。因此如果我们完全寄希望于通过gui识别来获取内容是不切实际的——先打好预防针 ,免得读者希望太大,失望更大,呵呵! 下面说说验证码的解决思路:其实解决图片验证码的思路有很多 ,我这里主要结合qtp9.5的新特性给大家介绍其中一种解决方案,就是利用它的ocr机制抓取文本内容 。 在qtp9.5中,对象识别能力有了进一步改善 ,其中针对文本识别方面进行了优化 ,引入了abbyy公司的ocr解决方案——这个相关的功能体现在qtp菜单的“tools-->options-->general --use text recognition mechanisms in this order ”里,详细内容后面会有具体介绍。 先来看看abbyy是何许公司,登录他们的官方网站可以看到一段相关介绍:“abbyy是世界ocr(光学字符识别) 、icr(手写体识别)和语言软件的领航者。abbyy 致力于人工智能(ai)和语言软件开发 。提供全套文档识别 ,转换和数据捕获技术的产品解决方案。 ”如果你使用过图像文档转换的软件,一定会听说过finereader ocr professional ,其实它就是abbyy公司的产品 ,用官方的说法就是“将通过扫描仪、mfp 或数码相机生成的图像快速转换为可编辑和可搜索的电子格式,而且识别率很高”,说白了就是可以借助它先进的ocr机制“读”出图片里的文本内容 ,并转换为pdf之类的文档。 有了abbyy这么强大的背后支持,qtp自然底气十足,那么qtp到底如何以ocr机制识别文本呢?我们首先先了解一下什么是ocr 。打开“百度百科_ocr ” ,它的说明:“ocr(optical character recognition,光学字符识别),是属于图型识别(pattern recognition ,pr)的一门学问。其目的就是要让计算机知道它到底看到了什么 ,尤其是文字资料。 由于ocr是一门与识别率拔河的技术,因此如何除错或利用辅助信息提高识别正确率,是ocr最重要的课题 ,icr(intelligent character recognition)的名词也因此而产生 。而根据文字资料存在的媒体介质不同,及取得这些资料的方式不同,就衍生出各式各样、各种不同的应用。”这里有个关键词:“正确率” ,也就是“识别率 ”——既然不能够总是100%,我们自然不可能完全寄希望于通过qtp能够每次100%正确的去识别图片里的文本。尤其是“道高一尺魔高一丈”的今天,验证码加入了大量的干扰素 ,如扭曲 、变形、错位、随机背景花纹,给ocr识别增加了很多难度——本来就不希望被软件识别到嘛 。 本文出自songfun的51testing软件测试博客,转载请保留出处及链接:/?songfun 了解了ocr之后 ,我们再来看看qtp对应的这个设置 。如前面所说,通过qtp菜单的“tools-->options”选中到“general--use text recognition mechanisms in this order ”,这里的四个选项就是对应的不同设置。我们看看帮助的描述(我做了翻译): 使用文本识别机制 指定qtp在采用 “文本”或者“文本区域” 的 检查点或输出值 的步骤时 ,捕获文本内容所使用的文本识别机制。 以下有三种识别方式: 1 、先使用windows api ,再使用ocr(默认) 。 指示qtp首先尝试以基于windows api的机制从对象上直接获取文本内容。如果未获取到文本(比如,文本属于图片的一部分),qtp就会使用ocr的机制尝试获取这段文本。 强烈建议在使用中日韩(象形文字)、英的语言环境下采用这个设置 。 2、先使用ocr ,再使用windows api。 指示qtp首先尝试使用ocr机制从对象上去获取文本。如果未获取到文本,qtp就会以windows api的机制去获取文本内容 。 3 、仅使用windows api方式。 指示qtp仅采用基于windows api的机制从对象上获取文本内容。 4 、仅使用ocr的方式 。 指示qtp仅采用基于ocr的机制从对象上获取文本内容。 在使用windows vista要使用这种方式。 上面的内容已经解释的很明确了,接下来我们通过textarea output value看看效果 。 (一)、内容是51testing的 ,qtp获取正确;内容是51testing的g风格彩字,qtp获取错误(显示为ic_check_pattern) (二)、内容是songfun的普通文本,qtp获取正确;内容是songfun的g风格彩字 ,qtp获取错误(也显示为ic_check_pattern) 有兴趣大家可以自己做一些图片,甚至可以用qq的验证码图片来试验一下,看看ocr效果 。

三.如何用python搞定验证码中的噪点

看上去不怎么难,没有干扰线没有粘连没有扭曲.但我还是没能用pytesser直接将它识别 止陆况并 出来,因为当中有噪点和其他背景噪声的存在.我的工作就是去掉这些讨厌的东西 先介绍一下,我们的工具: 它是基于一个c语言实现名为tesser的识别工具的python封装.可惜比较笨,只能做最简单的识别而且不认识汉字 它是我们喜欢写爬 等端协云乐众学短般氧 虫的孩子的最爱,提供人性化的接口,代 来自 价是失去了一点效率(写python就别考虑效率啦) 3.360问答BeautifulSo 信评息低兵木况触 up 它和Requests是一对好机油,让提取文档中所需的内容变 举征且顾业下李室 成一件简单的事情 它是今天的主角,PIL 雨满的被每宁众省煤特 是专门用作图像处理的库,很好很强大.熟练的人甚至可以用它来P图 如何写爬虫去实现模拟登录此处不细说,下面说说怎么解决验证码识别 解决思路如下: 1.先用PIL对图像做一次图像增强,因为原图中数字的边缘和背景中的噪声并不是太分明,做了增强之后能将两者分 洲皮 离.如果不分离,可能直力止不革损针城约还会在去噪点的时候导致数字中有部分会缺失 im = .open("randomimage/r 般同厂乱气省由欢后 g") im = (im).enhance(3)参数为3是经过实验之后感觉比较理想的值,太强不好,太弱也不好 2.做完预处理之后,就是去背景噪声了.背景噪声指的是背景中各种明暗变换的色块,肉眼也许不会注意到这个.但是风继唱知它的存在会给识别带来影响. 去活孔批继画倒高 我最初的做法是将图像转换为只有黑白两色,这样自然就将噪声转换成了噪点. 效果如图 但我希望能去掉噪点,成为这样 最先想到的是种子染色法 ,什么是种子染色法请参看这个链接 *例考胜宽普执副永 为了防止坏链,此处做部分转载 种子染色法英文叫做Flood Fill  ,实际上Flood Fill这个名称更贴切一点,因为这个方法作用在一个图的结点上时恰似洪水一样“淹没 ”与之相连的其他结点并以相同的方式蔓延出去,这个方 请计景马土制汽事众善队 法通常用于计算一个图的极大连通子图(这里的“图”是图论的概 效喜质 念)。设想一个无管上向图 ,我们从这个图中一个未标号( 武满三发某球 “标号”可以理解为“染色 ”)的结点开始 ,将此结点和从这个结点出发可达的所有结点都赋予相同的标号(染上相同的颜色),那么我们就得到了这些被标号的结点所组成的一个极大连通子图,搜索下一个未标号的结点并重复上述过程我们便可以找到所有的极大连通子图。“染色 ”的过程可以用D 艺乱吸按介华志半谁 FS或者BFS实现 ,如果结点数为V,边数为E,因为我们在Flood Fill过程中“造访”每个结点两次 ,“造访”每条边两次,所以得到所有极大连通子图的时间复杂度为o(V+E) 。 来自Wikipedia的一个示例: 想象每个白色方块为图中的结点,相邻的方块(上下左右)有边相连 ,那么这个图就有三个极大连通子图,这演示了Flo围器无差突收盐尼od Fill查找其中一个极大连通子图的过程。 在这是借要用种子染色法计算每块的面积,然后把小体积的块当作噪点去除. 代码在这 def check(j,i): try: if pix[j,i] == 0 and matrix[j][i] != -1: return True else: return False except: return False def juli(r,s): return abs(r[0]-s[0])+abs(r[1]-s[1])+abs(r[2]-s[2]) for i in range(w): for j in range(h): r = [0,0,0] s = [0,0,0] if pix[j,i] == 0: if check(j-1,i): r[0],r[1],r[2] = ((j,i)) s[0],s[1],s[2] = ((j-1,i)) print r print s print "-"*55 if juli(r,s) <=l: matrix[j][i] = matrix[j-1][i] maps[str(matrix[j][i])]+=1 elif check(j-1,i-1): r[0],r[1],r[2] = ((j,i)) s[0],s[1],s[2] = ((j-1,i-1)) if juli(r,s) <=l: matrix[j][i] = matrix[j-1][i-1] maps[str(matrix[j][i])]+=1 elif check(j,i-1): r[0],r[1],r[2] = ((j,i)) s[0],s[1],s[2] = ((j-1,i)) if juli(r,s) <=l: matrix[j][i] = matrix[j][i-1] maps[str(matrix[j][i])]+=1 elif check(j+1,i+1): r[0],r[1],r[2] = ((j,i)) s[0],s[1],s[2] = ((j+1,i+1)) if juli(r,s) <=l: matrix[j][i] = matrix[j+1][i+1] maps[str(matrix[j][i])]+=1 elif check(j,i+1): r[0],r[1],r[2] = ((j,i)) s[0],s[1],s[2] = ((j,i+1)) if juli(r,s) <=l: matrix[j][i] = matrix[j][i+1] maps[str(matrix[j][i])]+=1 elif check(j-1,i+1): pr[0],r[1],r[2] = ((j,i)) s[0],s[1],s[2] = ((j-1,i+1)) if juli(r,s) <=l: matrix[j][i] = matrix[j-1][i+1] maps[str(matrix[j][i])]+=1 elif check(j+1,i-1): r[0],r[1],r[2] = ((j,i)) s[0],s[1],s[2] = ((j+1,i-1)) if juli(r,s) <=l: matrix[j][i] = matrix[j+1][i-1] maps[str(matrix[j][i])]+=1 elif check(j+1,i): r[0],r[1],r[2] = ((j,i)) s[0],s[1],s[2] = ((j+1,i)) if juli(r,s) <=l: matrix[j][i] = matrix[j+1][i] maps[str(matrix[j][i])]+=1 else: n+=1 maps[str(n)]=1 matrix[j][i] = n for i in range(w): for j in range(h): if matrix[j][i]!=-1 and maps[str(matrix[j][i])]<=2: ((j,i),255)View Code 结果呢,不是很理想因为这个体积参数设小了,噪点没去干净,设大了数字部分可能也去了一小块.最重要的是这里噪点的大小不是很规律,很难找到一个不错的面积参数. 失败只是暂时的,经过观察发现背景噪声颜色明显比数字要浅的多.这也意味着它的RGB值要比数字小的多,通过分析RGB值能去掉大部分噪声,剩下来的噪点可以再通过种子染色法处理.也就是说,分别在两张图片(分别是黑白和彩色)上获取信息,在一张图片上做处理最后做识别 核心代码在这 r[0],r[1],r[2] = ((j,i)) if r[0]+r[1]+r[2]>=400 or r[0]>=250 or r[1]>=250 or r[2]>=250 : ((j,i),(255,255,255)) 至此,本次识别的问题就搞定啦,成功率在50%以上基本满足接口的需求

四.{title4}

{content4}

本文版权归趣KUAI排www.SEOguruBlog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ→61910465