python(自动化)利用selenium+百度ocr文字识别验证码实现自动登陆登陆CET-四级报名系统

步骤实现:
1:登陆打开CET-考试系统
2:填写相关登陆信息
3:调用百度ocr实现文字验证码识别
4:实现登陆

强调:如何使用和调用百度ocr文字识别接口
1:进入百度AI开发平台:链接
2:在页面上选择进入控制台:
python(自动化)利用selenium+百度ocr文字识别验证码实现自动登陆登陆CET-四级报名系统_第1张图片
3:登陆百度账号(没有百度账号的需要先注册)
python(自动化)利用selenium+百度ocr文字识别验证码实现自动登陆登陆CET-四级报名系统_第2张图片
4:进来后点击文字识别python(自动化)利用selenium+百度ocr文字识别验证码实现自动登陆登陆CET-四级报名系统_第3张图片
5:进来后再点击创建应用(这里我已创建好)
python(自动化)利用selenium+百度ocr文字识别验证码实现自动登陆登陆CET-四级报名系统_第4张图片
5:获取我门需要的三个信息,后面代码需要用到
即AppID,APIkey,SecretKey
python(自动化)利用selenium+百度ocr文字识别验证码实现自动登陆登陆CET-四级报名系统_第5张图片
需要用到的python库:
1:selenium
2:time(时间模块,用于适当的时间加载限制)
3:PIL(图像处理模块,也可以利用Open-cv模块代替实现相关需求)
4:baidu-aip模块
少数人可能在from aip import AipOcr 这段代码就报错了,原因是你没有安装百度的接口,不过没关系,你只需要用cmd进入你安装Python的路径下执行 pip install baidu-aip 即可
下面进入代码环节(有注释):

#利用百度ocr识别自动登陆四级考试网并进入报名页面
from  selenium import  webdriver
from time import sleep
from  PIL import  Image
from aip import  AipOcr
from selenium.webdriver.support.select import Select
from selenium.common.exceptions import UnexpectedAlertPresentException

#驱动的加载和访问页面
driver = webdriver.Chrome()
driver.maximize_window()
#设置页面加载时间
driver.set_page_load_timeout(20)
driver.set_script_timeout(20)
#CET-考试系统网址
url = 'http://cet-bm.neea.edu.cn/'
driver.get(url)

#点击进入报名页面
driver.find_element_by_xpath('//*[@id="main_l"]/a[1]/p[1]').click()
#填写相关信息
username = '######' #这里填写你的登陆用户名,如手机号
password = '#####'  #这里输入你的登陆密码
driver.find_element_by_xpath('//*[@id="txtUserName"]').send_keys(username)
driver.find_element_by_xpath('//*[@id="txtPassword"]').send_keys(password)
driver.implicitly_wait(3) #隐式等待

"""截屏并调用百度ocr文字识别输入验证码"""
while True:
    driver.find_element_by_xpath('//*[@id="txtCheckImageValue"]').clear() #每次执行前清空输入栏
    screenImg = r'D:\python\1.png'  #截图图片的存储路径,我这里放入我的相关目录,你也可以更改r'###'的内容
    #截图整个窗口的图,据此后面再根据坐标信息截图特定验证码位置的图
    driver.get_screenshot_as_file(screenImg)
    #获取验证码图片的位置坐标信息
    location = driver.find_element_by_xpath('//*[@id="imgCheckImage"]').location
    #获取验证码图片的尺寸大小
    size = driver.find_element_by_xpath('//*[@id="imgCheckImage"]').size
    #获取截图所需的位置信息
    left = int(location['x'])
    top = int(location['y'])
    right = int(location['x']+size['width'])
    bottom = int(location['y']+size['height'])
    #由上面的坐标信息截图特定区域,得到验证码截图
    img = Image.open(screenImg).crop((left,top,right,bottom))
    img.save(screenImg)
    #定义百度ocr相关变量,将你的前面百度复制三个信息填入其中
    AppID = '#########'
    APIKey = '##########'
    SecretKey = '#########'
    #初始化操作
    client = AipOcr(AppID,APIKey,SecretKey)
    i = open(screenImg,'rb') #以rb方式打开目标路径图片即验证码截图
    img = i.read()  #读取截图
    message = client.basicGeneral(img)
    print(message)
    for i in message.get('words_result'):
        print(i,i.get('words'))
    if message.get('words_result') != []:
        driver.find_element_by_xpath('//*[@id="txtCheckImageValue"]').send_keys(i.get('words'))
    else:
        driver.find_element_by_xpath('//*[@id="txtCheckImageValue"]').send_keys('识别不出来')
    #判断登陆情况据此执行不同操作
    try:
        #点击登陆按钮
        driver.find_element_by_xpath('//*[@id="ibtnLogin"]').click()
        if u'欢迎使用CET考试报名系统' not in driver.title:
            print("窗口弹出,验证码错误")
            #由于登陆失败会弹出对话框,下面是处理弹出的对话框
            alert = driver.switch_to.alert
            sleep(2)
            alert.accept()
        else:
            print("登陆成功!!")
            break
    except UnexpectedAlertPresentException:
        print("重新登陆......")
    driver.implicitly_wait(3)
    #注意重新登陆尝试需要对几个输入框都清空
    username = "#######"  #这里输入你的用户名
    password = "######"   #这里输入你的密码
    driver.find_element_by_xpath('//*[@id="txtUserName"]').clear()
    driver.find_element_by_xpath('//*[@id="txtUserName"]').send_keys(username)
    driver.find_element_by_xpath('//*[@id="txtPassword"]').clear()
    driver.find_element_by_xpath('//*[@id="txtPassword"]').send_keys('password')

print("恭喜,您已成功通过识别验证码")

你可能感兴趣的:(自动化,python)