关于python识别验证思路的案例分析

  

小编给大家分享一下关于python识别验证思路的案例分析,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

1、介绍

在爬虫中经常会遇到验证码识别的问题,现在的验证码大多分计算验证码、滑块验证码、识图验证码、语音验证码等四种。本文就是识图验证码,识别的是简单的验证码,要想让识别率更高,识别的更加准确就需要花很多的精力去训练自己的字体库。

识别验证码通常是这几个步骤:

(1)灰度处理

(2)二值化

(3)去除边框(如果有的话)

(4)降噪

(5)切割字符或者倾斜度矫正

(6)训练字体库

(7)识别

这6个步骤中前三个步骤是基本的,4或者5可根据实际情况选择是否需要。

经常用的库有pytesseract(识别库)、OpenCV(高级图像处理库)、imagehash(图片哈希值库)、numpy(开源的、高性能的Python数值计算库)、PIL的 Image,ImageDraw,ImageFile等。

2、实例

以某网站登录的验证码识别为例:具体过程和上述的步骤稍有不同。

关于python识别验证思路的案例分析

首先分析一下,验证码是由4个从0到9等10个数字组成的,那么从0到9这个10个数字没有数字只有第一、第二、第三和第四等4个位置。那么计算下来共有40个数字位置,如下:

关于python识别验证思路的案例分析

那么接下来就要对验证码图片进行降噪、分隔得到上面的图片。以这40个图片集作为基础。

对要验证的验证码图片进行降噪、分隔后获取四个类似上面的数字图片、通过和上面的比对就可以知道该验证码是什么了。

以上面验证码2837为例:

1、图片降噪

关于python识别验证思路的案例分析

2、图片分隔

关于python识别验证思路的案例分析

3、图片比对

通过比验证码降噪、分隔后的四个数字图片,和上面的40个数字图片进行哈希值比对,设置一个误差,max_dif:允许最大hash差值,越小越精确,最小为0。

关于python识别验证思路的案例分析

这样四个数字图片通过比较后获取对应是数字,连起来,就是要获取的验证码。

完整代码如下:

#coding=utf-8
  import 操作系统
  import 再保险
  得到selenium  import  webdriver
  得到selenium.webdriver.common.keys  import 钥匙
  import 时间
  得到selenium.webdriver.common.action_chains  import  ActionChains
  import 集合
  import  mongoDbBase
  import  numpy
  import  imagehash
  得到PIL  import 形象,ImageFile
  import  datetime
  class  finalNews_IE:
  ,,,def  __init__(自我、strdate logonUrl、firstUrl keyword_list, exportPath, codepath, codedir):
  ,,,,,,,self.iniDriver ()
  ,,,,,,,self.db =, mongoDbBase.mongoDbBase ()
  ,,,,,,,self.date =strdate
  ,,,,,,,self.firstUrl =firstUrl
  ,,,,,,,self.logonUrl =logonUrl
  ,,,,,,,self.keyword_list =keyword_list
  ,,,,,,,self.exportPath =exportPath
  ,,,,,,,self.codedir =codedir
  ,,,,,,,self.hash_code_dict ={}
  ,,,,,,,for  f 拷贝范围(0,10):
  ,,,,,,,,,,,for  l 拷贝范围(1、5):
  ,,,,,,,,,,,,,,,file =, os.path.join (codedir,“codeLibrary \ code", +,, str (f), +, & # 39; _ # 39; + str (l), +,“.png")
  ,,,,,,,,,,,,,,,#,打印(文件)
  ,,,,,,,,,,,,,,,hash =, self.get_ImageHash(文件)
  ,,,,,,,,,,,,,,,self.hash_code_dict(散列)=,str (f)
  ,,,def  iniDriver(自我):
  ,,,,,,,#,通过配置文件获取IEDriverServer.exe路径
  ,,,,,,,IEDriverServer =,“C: \ Program 文件\ Internet  Explorer \ IEDriverServer.exe"
  ,,,,,,,os.environ [“webdriver.ie.driver"],=IEDriverServer
  ,,,,,,,self.driver =, webdriver.Ie (IEDriverServer)
  ,,,def  WriteData(自我,,信息,文件名):
  ,,,,,,,fileName =, os.path.join (os.getcwd (),, self.exportPath  +, & # 39;/& # 39;, +,文件名)
  ,,,,,,,with 开放(文件名,& # 39;一个# 39;),as  f:
  ,,,,,,,,,,,f.write(消息)
  ,,,#,获取图片文件的散列值
  ,,,def  get_ImageHash(自我,imagefile):
  ,,,,,,,hash =,没有
  ,,,,,,,if  os.path.exists (imagefile):
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

关于python识别验证思路的案例分析