python3 利用百度AI进行简单的字母数字验证码识别
新手学习笔记,勿喷!
完成网页登录试过的方法:
- 添加cookie(有时候过一会,或者过一天就不能登录,不知道为什么)
- 基于传统的机器学习SVM(图片分类人工处理工作量比较大,不知道是我的样本少还是……反正识别不准)
基本原理
- 利用selenium操作网页,对登录页面截图,截取验证码图片
- 利用百度AI进行字母数字验证码识别,完成登录
下面代码:
from selenium import webdriver
from aip import AipOcr
from PIL import Image
from selenium.webdriver.support.ui import WebDriverWait
import os
import time
APP_ID = "百度AI——ID"
API_KEY = "百度AI——APIKEY"
SECRET_KEY = "百度AI——SECRET_KEY "
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
def getPic():
#获取截图
driver.get_screenshot_as_file('screenshot.png')
#获取指定元素位置
element = driver.find_element_by_xpath('//*[@id="kaptchaImage"]')
print(element.size)
print(element.location)
#获取位置不准,进行微调
left = int(element.location['x'])+152
top = int(element.location['y'])+42
right = int(element.location['x'] + element.size['width'])+152
bottom = int(element.location['y'] + element.size['height'])+42
#通过Image处理图像
im = Image.open('screenshot.png')
im = im.crop((left, top, right, bottom))
im.save('code.png')
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get("http://XXXX/login.jsp") # 地址栏里输入网址
driver.find_element_by_xpath('//*[@id="pfzj"]').send_keys("账号") #
driver.find_element_by_xpath('//*[@id="efgk"]').send_keys("密码")
def getChar():
getPic()
image = get_file_content('code.png')
""" 调用通用文字识别(高精度版) """
result = client.basicAccurate(image)
words_result = result.get("words_result")
#删除屏幕截图
os.remove('screenshot.png')
#删除验证码截图
os.remove('code.png')
print(words_result)
ss = words_result[0].get("words")
#删除空格
ss = ss.replace(' ','')
return(ss)
driver.find_element_by_xpath('//*[@id="authcode"]').send_keys(getChar())
driver.find_element_by_xpath('//*[@id="form_submit"]').click()