一窗式后台验证码自动识别及登录(selenium+python)

大概思路:

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.

 

转载于:https://www.cnblogs.com/chenshengkai/p/11322194.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值