1、上节提到用ddddocr框架识别验证码,但很多情况下,识别并不准确,导致经常登录失败,目前并没有好的、精准的识别框架来满足。网上搜索提到的办法就是用大数据,神经网络训练去提高精准度,但往往这种应用在自动化登录这块就显得尤其麻烦。因此,本人觉得采用多次认证的办法,只要能识别成功即可。通过循环,直到认证成功。核心代码如下:
# 反复验证登录,直到输入正确的验证码登录成功
loginStatus=False
while loginStatus != True:
# 刷新页面
driver.refresh()
time.sleep(3)
# 验证码处理
# 找到验证码并将验证码以截图的方式保存
driver.find_element(By.XPATH, '//*[@id="img_vcode"]').screenshot("D:/vscode/test/picture/img.png")
# 读取彩色图像
image = cv2.imread('D:/vscode/test/picture/img.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 保存处理后的图像为新文件
cv2.imwrite('D:/vscode/test/picture/gry.png', gray)
ocr = ddddocr.DdddOcr()
with open('D:/vscode/test/picture/img.png', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)
# 填入验证码
driver.find_element(By.NAME, 'vldcode').send_keys(res)
# 找到用户名和密码输入框并输入正确的用户名和密码
username_input = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "user_name")))
username_input.send_keys(f'{user}')
time.sleep(1)
password_input = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "password")))
password_input.send_keys(f'{password}')
time.sleep(1)
login_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "loginbtn")))
login_button.click()
time.sleep(1)
# 判断登录是否成功的条件
login_success_condition = '书签' in driver.page_source
print(login_success_condition)
if login_success_condition:
# 登录成功,结束循环
loginStatus=True
break
else:
# 登录失败,输出提示信息
print("登录失败,请重新登录")
continue
2、判断登录成功的条件为正常登录成功后的页面,检查某个字段即可。亲测,正常情况下会循环个几次,最后一次识别成功,可正常登录。