python+selenium 实现验证码由base64转为jpg/png格式,并识别验证码

在使用python+selenium实现自动化登录时,遇到了关于验证码的一些问题,主要是验证码格式的转换和识别。我这里的验证码都是用的base64格式,我的思路是先将base64格式转化为jpg或者png格式,然后用ddddocr模型来识别图片内容。

#base64转jpg
import base64
from selenium import webdriver
from selenium.webdriver.common.by import By
#使用xpath定位到验证码所在的位置
el = driver.find_element_by_xpath('//*[@id="app"]/div/form/div[3]/div/div[2]/img')
data = el.get_attribute("src")
print(len(data))
#去掉base64的'data:image/png;base64,'
a = data.replace('data:image/png;base64,', '')
print(len(a))
missing_padding = 4 - len(a) % 4
if missing_padding:
    a += '=' * missing_padding
print(a, file=open('base64.txt', 'w'))
with open('base64.txt', 'r') as f_obj:
    b = base64.b64decode(f_obj.read())
#注意base64的数据前头部分,如果是data:image/png,则转换成jpg格式
    file = open('1.jpg', 'wb')
    file.write(b)
print('图片已下载')
code = driver.find_element_by_xpath('//*[@id="app"]/div/form/div[3]/div/div[1]/input')  # 验证码输入框位置
ocr = ddddocr.DdddOcr()
time.sleep(3)
try:
    with open('1.jpg', 'rb') as fp:
        image = fp.read()
    catch = ocr.classification(image)  # 验证码返回给catch
    print(catch)
    #将验证码内容写入输入框
    code.send_keys(catch)
except Exception as e:
    print(e)
print('successful')

总结:

  1. replace()不生效: replace返回的是一个新的值,需要用一个新的变量来接收
  2. ddddocr模型相对好用,但是也不能避免出现识别有误的情况,识别有误时可以尝试循环
  3. 在由base64格式转换jpg格式时,一定要去掉base64的前头部分

你可能感兴趣的:(软件测试,python,selenium,爬虫)