大概思路:
1.通过对登录页面全屏截图后,对获取的图像进行二次截图,保留66*35的验证码图片。
2.对验证码图片进行二值化和降噪处理。
3.通过Selenium+Python进行自动化登录操作。
代码如下:
1 #导包 2 from selenium import webdriver 3 from PIL import Image,ImageDraw 4 from time import sleep 5 import pytesseract 6 #定义浏览器句柄,赋值url为一窗式后台地址 7 driver = webdriver.Chrome() 8 driver.implicitly_wait(10) #隐式等待10s 9 url = 'http://192.168.21.150:8083/' 10 #窗口最大化 11 driver.maximize_window() 12 13 # 一窗式后台截取验证码,代码如下: 14 for count in range(1): 15 driver.get(url) 16 driver.save_screenshot('E:/pictures/Codes/text.png') 17 box=(1032,511,1098,546) 18 i=Image.open('E:/pictures/Codes/text.png') 19 frame4=i.crop(box) #二次截图 20 frame4.save( 'E:/pictures/Codes/new_Codes'+'/img_' + str(count) + '.png') #二次截图后命名 21 print('count:'+str(count)) 22 23 #对截取后的验证码二值化和降噪,代码如下: 24 # 二值数组 25 t2val = {} 26 def twoValue(image, G): 27 for y in range(0, image.size[1]): 28 for x in range(0, image.size[0]): 29 g = image.getpixel((x, y)) 30 if g > G: 31 t2val[(x, y)] = 1 32 else: 33 t2val[(x, y)] = 0 34 35 # 根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点 36 # G: Integer 图像二值化阀值 37 # N: Integer 降噪率 0 <N <8 38 # Z: Integer 降噪次数 39 # 输出 40 # 0:降噪成功 41 # 1:降噪失败 42 def clearNoise(image, N, Z): 43 for i in range(0, Z): 44 t2val[(0, 0)] = 1 45 t2val[(image.size[0] - 1, image.size[1] - 1)] = 1 46 for x in range(1, image.size[0] - 1): 47 for y in range(1, image.size[1] - 1): 48 nearDots = 0 49 L = t2val[(x, y)] 50 if L == t2val[(x - 1, y - 1)]: 51 nearDots += 1 52 if L == t2val[(x - 1, y)]: 53 nearDots += 1 54 if L == t2val[(x - 1, y + 1)]: 55 nearDots += 1 56 if L == t2val[(x, y - 1)]: 57 nearDots += 1 58 if L == t2val[(x, y + 1)]: 59 nearDots += 1 60 if L == t2val[(x + 1, y - 1)]: 61 nearDots += 1 62 if L == t2val[(x + 1, y)]: 63 nearDots += 1 64 if L == t2val[(x + 1, y + 1)]: 65 nearDots += 1 66 if nearDots < N: 67 t2val[(x, y)] = 1 68 69 def saveImage(filename, size): 70 image = Image.new("1", size) 71 draw = ImageDraw.Draw(image) 72 for x in range(0, size[0]): 73 for y in range(0, size[1]): 74 draw.point((x, y), t2val[(x, y)]) 75 image.save(filename) 76 77 for i in range(0, 1): 78 path = 'E:/pictures/Codes/new_Codes'+ '/img_' + str(i) + '.png' 79 image = Image.open(path) 80 image = image.convert('L') 81 twoValue(image, 100) 82 clearNoise(image, 2, 1) 83 path1 = 'E:/pictures/Codes/new_Codes_over' + '/img_'+ str(i) + ".jpg" 84 saveImage(path1, image.size) 85 print("返回信息:验证码到手,处理成功,春哥附体,定能识别!") 86 87 #将处理后的验证码用Tesseract识别,代码如下: 88 #添加pytesseract参数变量 89 pytesseract.pytesseract.tesseract_cmd= "C:\Program Files (x86)\Tesseract-OCR/tesseract.exe" 90 tessdata_dir_config = '--tessdata-dir "C:\Program Files (x86)\Tesseract-OCR/tessdata" ' 91 #打开需要识别的验证码图片 92 image1=Image.open("E:/pictures/Codes/new_Codes_over/img_0.jpg") 93 #识别验证码,赋值变量为code 94 sleep(5) 95 print('开始识别二维码,请等待...') 96 code=pytesseract.image_to_string(image1) 97 #打印识别后的验证码 98 print('验证码:' + str(code)) 99 100 #拿到验证码后,进行登录操作,代码如下: 101 sleep(1) #等待上述操作1s 102 driver.find_element_by_xpath('//*[@id="username"]').send_keys("adminht") #输入账号 103 driver.find_element_by_xpath('//*[@id="password"]').send_keys("88888888") #输入密码 104 sleep(1) #等待1s后输入拿到的验证码 105 driver.find_element_by_xpath('//*[@id="yzm_value"]').send_keys(code) #输入验证码 106 # 点击登录,登录一窗式后台 107 sleep(1) 108 driver.find_element_by_xpath('//*[@class="yhht-login-container"]/div[2]/div[2]/a').click() 109 #成功与否,都等待3s关闭浏览器 110 sleep(3) 111 driver.quit()
感觉Tesseract-OCR字符识别准确率有点低(其实是很低,hhh)
经过对这软件深入了解后发现,原来可以对Tesseract-OCR样本进行训练。
下次更新会放上Tesseract-OCR样本训练的方法。
----------------------------------------------------------------------------------------------------
talk is cheap , show me the code.