基于python的验证码自动识别

基于python的验证码自动识别 Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录 Python 2

本文包含相关资料包-----> 点击直达获取<-------

基于python的验证码自动识别

Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录

前言

自动登陆时候遇到验证码,采用Tesseract+PIL进行识别和自动填充,不让验证码成为我们自动化登录的阻碍,哈哈哈

Talk is cheap, Show me the code

自动识别验证码模拟登陆,注意是自动 ,一键登录,不是那种扫出验证码,然后手动输入登录!首先来代码实现吧!

```python

- - coding: utf-8 - -

from selenium import webdriver import os import pytesser import sys,time from PIL import Image,ImageEnhance

shift+tab多行缩进(左)

reload(sys) PostUrl = "http://yjsymis.hrbeu.edu.cn/gsmis/indexAction.do"

driver=webdriver.Firefox() driver.get(PostUrl)

i=0 while 1:#sb登录系统,即使输对所有消息还是登不进去的,需要登录两次及以上

i=i+1
try:
    elem_user = driver.find_element_by_name('id')
    elem_psw = driver.find_element_by_name('password')
    elem_code = driver.find_element_by_name('checkcode')
except:
    break
#-------------------对验证码进行区域截图,好吧,这方法有点low------------------
driver.get_screenshot_as_file('C:\Users\MrLevo\image1.jpg')#比较好理解
im =Image.open('C:\Users\MrLevo\image1.jpg')
box = (516,417,564,437)  #设置要裁剪的区域
region = im.crop(box)     #此时,region是一个新的图像对象。
#region.show()#显示的话就会被占用,所以要注释掉
region.save("e:/image_code.jpg")

#-------------------------------------------------------------------

#--------------ImageGrab.grab()直接可以区域截图,但是有bug,截图不全-------
'''
bbox = (780, 0, 1020, 800)
img = ImageGrab.grab()
img.save("E:\image_code.jpg")
img.show()
'''
#-------------------------手动输入验证码:适用范围更广,但不够方便------------------------------
'''
response = opener.open(CaptchaUrl)
picture = response.read()
with open('e:/image.jpg', 'wb') as local:
    local.write(picture)
# 保存验证码到本地

#------------对于不能用pytesser+ocr进行识别,手动打开图片手动输入--------
# 打开保存的验证码图片 输入
#SecretCode = raw_input('please enter the code: ')
#----------------------------------------------------------------------
'''

#--------------------图片增强+自动识别简单验证码-----------------------------
#time.sleep(3)防止由于网速,可能图片还没保存好,就开始识别
def image_file_to_string(file):
    cwd = os.getcwd()
    try :
        os.chdir("C:\Users\MrLevo\Anaconda2\Lib")
        return pytesser.image_file_to_string(file)
    finally:
        os.chdir(cwd)
im=Image.open("E:\\image_code.jpg")
imgry = im.convert('L')#图像加强,二值化
sharpness =ImageEnhance.Contrast(imgry)#对比度增强
sharp_img = sharpness.enhance(2.0)
sharp_img.save("E:\\image_code.jpg")
#http://www.cnblogs.com/txw1958/archive/2012/02/21/2361330.html
#imgry.show()#这是分布测试时候用的,整个程序使用需要注释掉
#imgry.save("E:\\image_code.jpg")

code= pytesser.image_file_to_string("E:\\image_code.jpg")#code即为识别出的图片数字str类型
print code
#打印code观察是否识别正确


#----------------------------------------------------------------------
if i <= 2: # 根据自己登录特性,我这里是验证码失败一次,重填所有,失败两次,重填验证码
    elem_user.send_keys('S315080092')
    elem_psw.send_keys('xxxxxxxxxx')

elem_code.send_keys(code)
click_login = driver.find_element_by_xpath("//img[@src='main_images/images/loginbutton.gif']")
click_login.click()

time.sleep(5)#搜索结果页面停留片刻

driver.save_screenshot('C:\Users\MrLevo\image.jpg')

driver.close()

driver.quit()

```

Show Gif ( :

遇到问题及解决方法

  • 验证码取得问题,因为每次刷新之后验证码动态刷新,所以如果不采用cookie的话(我还不太会用cookie),根本捉不到元素,这个我在下篇文章中采用cookie来登录的,但不是调用浏览器,这个跑远了,下次说。

解决方案:用了 driver.get_screenshot_as_file 方法,机智的进行全截图,然后采用PIL中的crop进行再截图操作,可能有人会说,为什么不采用 ImageGrab.grab() 函数来做,好吧,因为这个函数在win10上尽然!截不了全图!!自己试了才知道,btw,我的分辨率1920x1080,难道和分辨率有关?反正这个我截了好久都没有成功,到最后才想到,截全部看看,结果,tmd只有一半,我说怎么都找不到要截图的部分!

  • 验证码验证错误率高问题

解决方案,采用PIL强大的图像处理功能,我先将图片二值化,本来是蓝色字体的,,然后再进行对比度强化来锐化图片,然后再调用Tesseract.exe进行处理,提高的识别精度不是一点两点:看图比较,左1是用cookie抓的原图,右边是全景截图,再定位截图,再进行二值化和锐化处理的图,本来我想着用matlab做图像识别的,但是想想还要调用,感觉有点麻烦。。。

  • 调用Tesseract.exe问题

解决方案因为程序执行图像识别需要调用Tesseract.exe,所以必须把路径切到有这个exe的路径下,刚开始,以为和包依赖,结果根本没有识别出任何图!折腾一个多小时才写好验证码识别的问题----单独测试的确很重要,记一笔!

  • 登录失败问题--mdzz学校教务系统二次验证

解决方案,写了一个while循环,把主程序很大部分都扔进去了,目的也很明确,如果第一次登录失败,再重复进行登录,注意采用try试探元素是否仍然存在,except来抛出break结束循环,因为登录成功后,比如说 driver.find_element_by_name('id') 是不存在的!所以当这个元素在登陆后的界面找不到时,那就说明登录成功,ok,跳出循环,进行下一步操作。

  • 明明图片已截取,为什么没有识别

解决方案,这个我真的没想到,我一直以为可能因为save时候还没下载好,导致库中没有这张图,那就不能识别,但是我用time.sleep函数让它停下来缓缓,还是不行,我就很无语了,想了半天,可能是因为图片被占用!因为我有一个img.show()函数,为了检测有没有截取到标准的图,然后show之后这个图像就被占用了!就像你在编辑word时候,是无法删除word文档一样!果然在注释掉show之后,一切可行,真是差错查了小半天啊!!

  • 元素一切就位,为什么不执行操作

解决方案,这个有点脑残了,不过的确是我遇到的,还是记上一笔,然后骂自己一遍sb,没有click()你让它怎么处理!!!就像用cookie登录时候还有个ENTRY呢!

  • 两次验证失败后,用户名重复累加

解决方案,直接加了个变量,计数循环次数,观察到只要超过两次没有登录上,就会累加登录名和用户密码,直接写了个if进行判断,完事!

  • im.crop(box)裁剪区域选择困难症

解决方案,多试几次,反正我是试出来的。。。。当然,你点击图片进行审查元素时候,可以看到图片大小,那么,你就可以知道横纵坐标差值多少,但是大范围区域还得自己试,如有更好的办法,请告知,以下为我截图实验次数,次数30+

  • 导入不了Image,ImageEnhance

解决方案,因为PIL用的是第三方库,所以,采用的导入方式是这样的,多看看官方文档就可以,官方描述如下 Use from PIL import Image instead of import Image .

  • 找不到应该键入的元素

这个问题,请单击要输入的空白处右键,审查元素,就可以看到,然后根据 driver.find_element_by_ 各种方法来定位元素,如果输入进行了隐藏,在当前页面找不到怎么办,就像如下图,需要先点击我的图书馆,才能看到输入的账户和密码,那么先找我的图书馆的元素,进行click操作,之后再找元素,一句话,把自己想成浏览器,阿不,把python想成浏览器。。。。。

上图的代码我也放上,大同小异,比有验证码的简单,但是多了一个click操作。

```python

- - coding: utf-8 - -

from selenium import webdriver import time import sys

shift+tab多行缩进(左)

reload(sys) PostUrl = "http://lib.hrbeu.edu.cn/#" driver=webdriver.Firefox() driver.get(PostUrl)

elem_user = driver.find_element_by_name('number') elem_psw = driver.find_element_by_name('passwd')

选择我的图书馆,点击后才能看到输入账号密码

click_first = driver.find_element_by_xpath("//ul[@id='imgmenu']/li[4]") click_first.click() elem_user.send_keys('S315080092') elem_psw.send_keys('xxxxxxxx')

点击登录

click_second = driver.find_element_by_name('submit') click_second.click()

time.sleep(5)

登陆后选择

click_third = driver.find_element_by_xpath("//*[@id='mainbox']/div/div/ul/li/a") click_third.click()

time.sleep(5)#搜索结果页面停留片刻

driver.save_screenshot('C:\Users\MrLevo\image.jpg')

driver.close() driver.quit() ```

参考文献

  • 复杂字符验证码识别算法研究(青岛理工大学·潘浩)
  • 基于Java技术平台的办公管理系统设计与实现(电子科技大学·聂继锋)
  • 基于web的人脸识别登陆和管理系统设计与实现(郑州大学·王哲)
  • 基于身份认证的呼叫中心系统的设计与实现(电子科技大学·朱建奇)
  • 多维码证卡综合信息查询验证系统的设计与实现(华中科技大学·胡西)
  • 基于区块链的简历认证系统的设计与实现(厦门大学·江麒海)
  • 面向对象软件代码结构解析及知识图谱构建(西南大学·关雪婷)
  • IBE标识符管理系统的开发与应用(武汉理工大学·杨淑龙)
  • 多维码证卡综合信息查询验证系统的设计与实现(华中科技大学·胡西)
  • 基于指纹识别的身份认证中心的设计与实现(山东大学·彭盼)
  • 基于Flask的形式化验证系统的设计与实现(北京交通大学·周文帆)
  • 基于Java技术平台的办公管理系统设计与实现(电子科技大学·聂继锋)
  • 提供人脸识别服务的计费管理系统设计与实现(大连理工大学·宋一凡)
  • IBE标识符管理系统的开发与应用(武汉理工大学·杨淑龙)
  • 基于深度学习的验证码识别技术(大连交通大学·慕亚东)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设助手 ,原文地址:https://bishedaima.com/yuanma/35546.html

相关推荐

发表回复

登录后才能评论