验证码的识别

Python023

验证码的识别,第1张

验证码是一种反爬虫的措施,目前的验证码主要有图像验证码、极验滑动验证码、点触验证码、微博宫格验证码等。根据不同类型的验证码,有以下识别的方法。

利用OCR字符识别技术来实现,需要安装tesserocr库进行识别。 因为验证码图片的背景有些多余的线条、颜色会干扰识别效果,因此可以在识别前对图片进行二值化处理或灰度处理

它通过拖动滑块来拼合图像进而实现验证。识别的主要思路: 利用selenium来模拟点击验证按钮,获取包含缺口的图片,将原图与其对比,识别出缺口位置,模拟拖动。模拟拖动时需要注意,不能匀速,因为人无法做到匀速拖动,因此会导致识别识别。比较好的办法就是,模拟加速和减速运动来进行拖动。前段先加速后段在减速。

这种验证码主要有两种,一种是点击图中所以符合要求的图片,二是按照顺序点击指定的文字。对于这种验证码,可以利用第三方平台来实现识别,比如超级鹰。具体思路 将验证码的图片传入到第三方平台上,然后根据第三方平台范围的坐标位置,进行依次点击。

这种验证码的宫格之间会有一条指示连线,指示了用户需要滑动的轨迹。如果要识别这种验证码,就需要识别箭头的指示方向,因此需要首先找到所有箭头的位置,然后计算像素点的变化规律。这个方法比较麻烦。对于这种验证码可以采用另一种思路: 模板匹配,即首先将所有可能出现的验证码图片收集下来,这样每个图片的滑动顺序已知,构成一个模板库。在每一次识别时,将原图与模板库中的图片进行匹配即可。

我们首先识别最简单的一种验证码,即图形验证码。这种验证码最早出现,现在也很常见,一般由4位字母或者数字组成。例如,中国知网的注册页面有类似的验证码,页面如下所示:

表单中最后一项就是图形验证码,我们必须完全正确输入图中的字符才可以完成注册。

更多有关验证码的知识,可以参考这些文章:

Python3爬虫进阶:识别图形验证码

Python3爬虫进阶:识别极验滑动验证码

Python3爬虫进阶:识别点触点选验证码

Python3爬虫进阶:识别微博宫格验证码

·本节目标以知网的验证码为例,讲解利用OCR技术识别图形验证码的方法。

·准备工作识别图形验证码需要库tesserocr,以mac安装为例:在mac下,我们首先使用Homebrew安装ImageMagick和tesseract库:    brew install imagemagickbrew install tesseract 接下来再安装tesserocr即可:pip3 install tesserocr pillow这样我们就完成了            tesserocr的安装。

·获取验证码为了便于实验,我们先将验证码的图片保存到本地。打开开发者工具,找到验证码元素。验证码元素是一张图片,它的ser属    性是CheckCode.aspk。所以我们直接打开如下链接就可以看到一个验证码,右键保存即可,将其命名为code.jpg:

这样我们就得到一张验证码图片,以供测试识别使用。

相关推荐:《Python教程》

识别测试

接下来新建一个项目,将验证码图片放到项目根目录下,用tesserocr库识别该验证码,代码如下所示:

这里我们新建了一个Image对戏那个,调用了tesserocr的image_to_text( )方法。传入该Image对象即可完成识别,实现过程非常简单,结果如下:

我们可以看到,识别的结果和实际结果有偏差,这是因为验证码内的多余线条干扰了图片的识别。

另外,tesserocr还有一个更加简单的方法,这个方法可以直接将图片文件转为字符串,代码如下:

不过这种方法的识别效果不如上一种的好。

验证码处理

对于上面的图片,我们可以看到其实并没有完全识别正确,所以我们需要对图像作进一步的处理,如灰度转换、二值化等操作。

我们可以利用Image对象的convert( )方法参数传入L,即可将图片转化为灰度图像,代码如下:

传入1即可将图片进行二值化处理,如下所示:

我们还可以指定二值化的阈值。上面的方法采用的是默认阈值127。不过我们不能直接转化原图,要将原图先转化为灰度图像,然后再指定二值化阈值,代码如下:

在这里,变量threshold代表二值化阈值,阈值设置为160,之后我们来看看我们的结果:

我们可以看到现在的二维码就比较方便我们进行识别了;那么对于一些有干扰的图片,我们做一些灰度和二值化处理,这会提高图片识别的正确率。