一、准备工作
更新pip
python -m pip install --upgrade pip -i https://pypi.douban.com/simple
下载“带带弟弟OCR” Github地址:https://github.com/sml2h3/ddddocr
该库需要安装几个依赖库:
import onnxruntime import PIL import cv2
安装onnxruntime库
当时安装这个库搞了老半天,python这些不常见的库对小白是真的不友好,真麻烦。
我这里本地环境是python3.10
,但是这个库好像没有能兼容python3.10
的版本
搞了半天都没能安装上,于是只好安装个python3.9
。
安装好python3.9
后,在pycharm
内和pip
都没能安装上…
只好找国内源手动下载安装:
https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/onnxruntime/
我这里下载的是最后一个onnxruntime-1.9.0-cp39-cp39-win_amd64.whl
说明一下这个文件名中的cp39
代表支持python3.9
,win
代表windows
系统,amd64
代表64
位操作系统
下载后放在项目目录内,打开cmd切换到当前目录
pip install .\onnxruntime-1.11.0-cp39-cp39-win_amd64.whl
输入命令,安装
这个安装完可能会安装在python3.9
根目录下的Python39\Lib\site-packages
目录内
这里我也懒得查怎么配置了,直接复制到项目目录内的,后面涉及到安装库的时候我都是复制进项目目录的。
安装PIL库
安装这个库的时候也遇到了不少问题…总之就是正常pip install PIL
安装不上
搜到了个能安装的命令
pip install pillow
输入命令,安装低版本PIL
安装cv2库
这个库也是在pycharm
里搜了半天,pip
半天也没安装上,一搜这个库的全名叫opencv-python
我这里是国内源的安装命令
pip install opencv-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
安装不上的可以下载库文件手动安装:
https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/
至此,准备工作完毕。
二、代码示例
import warnings import time import ddddocr import onnxruntime import cv2 from PIL import Image from selenium import webdriver from selenium.webdriver.chrome.service import Service # RPA自动识别图片验证码demo # 屏蔽warning警告输出 warnings.filterwarnings('ignore') s = Service(r"C:\Program Files\Google\Chrome\Application\chromedriver.exe") driver = webdriver.Chrome(service=s) driver.set_window_size(1200, 1000) driver.implicitly_wait(10) driver.get('你要访问的登录地址') driver.find_element_by_id('username').send_keys('admin') driver.find_element_by_id('password').send_keys('123456') driver.find_element_by_id('login-btn').click() time.sleep(2) # 获取验证码图片对象 img_ele = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div[2]/div[1]/img') # 登录页面截图 driver.save_screenshot("pic.png")#可以修改保存地址 # 获取网页验证码坐标 left = img_ele.location['x'] # x点(左下角)坐标 top = img_ele.location['y'] # y点(左上角)坐标 right = img_ele.size['width'] + left # 右上角点坐标 down = img_ele.size['height'] + top # 右下角点坐标 # 打开截图 image = Image.open('pic.png') # 将验证码根据坐标截取出来 code_img = image.crop((left, top, right, down)) code_img.save('codeimg.png') # OCR识别图片验证码 ocr = ddddocr.DdddOcr() with open('codeimg.png', 'rb') as f: image = f.read() # 获取识别结果 res = ocr.classification(image) print(res) # 输出>>> mvn0
但这个库的识别成功率还是挺低的, 这里写了一个递归函数, 可以循环识别, 直到识别成功
import warnings import time import ddddocr import onnxruntime import cv2 from PIL import Image from selenium import webdriver from selenium.webdriver.chrome.service import Service # 识别成功标识 is_success = 0 def ddocr(): # 登录页面截图 driver.save_screenshot("pic_window.png") # 可以修改保存地址 # 打开截图 image = Image.open('pic_window.png') # 将验证码根据坐标截取出来 code_img = image.crop((left, top, right, down)) code_img.save('pic_code.png') # OCR识别图片验证码 ocr = ddddocr.DdddOcr() # 打开截取的验证码图片 with open('pic_code.png', 'rb') as f: image = f.read() # 获取识别结果 code = ocr.classification(image) print('识别结果:', code) time.sleep(1) # 填入验证码 driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div[2]/input').send_keys(code) # 点击确认按钮 driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[3]/div/button[2]').click() time.sleep(1) # 判断弹窗提示元素是否存在 # element: 弹窗对象 def isElementExistence(element): try: element = driver.find_element_by_class_name(element) except NoSuchElementException as E: # print("弹窗不存在") return False else: # print("弹窗存在") return True # 判断弹窗提示元素是否存在 isset_alert = isElementExistence('message') # 如果有验证码输入错误的弹窗出现,判断弹出信息来选择对应操作 if isset_alert is True: alert = driver.find_element_by_class_name('message').text print(alert) if alert == '验证码输入错误': time.sleep(3) # 点击登录 driver.find_element_by_xpath('//*[@id="app"]/div/div[1]/span').click() ddocr() elif alert == '请输入验证码': time.sleep(3) # 点击看不清换一张 driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div[2]/div[2]/span').click() ddocr() else: print('未知错误') else: print('图片验证码识别成功') global is_success is_success = 1 # 执行递归函数,识别验证码 ddocr() # 识别成功打印成功标识 print(is_success) # 开始写登录后的代码 if is_success == 1: print('已识别验证码, 登录成功') else: print('识别失败')