from selenium import webdriver
import pytesser3
import time
driver = webdriver.Chrome()
# 循环输入验证码,因为一遍可能不能正确识别,直到正确识别,再进行其他操作
accept = False
while not accept:
try:
# 打开含有验证码的搜索页
driver.get('your link')
time.sleep(3)
# 找到输入框input,输入你的搜索关键词
input = driver.find_element_by_id('keyword')
input.send_keys('your keyword')
time.sleep(5)
# 验证码识别
# 先对浏览器当前页面截图,并存储
driver.get_screenshot_as_file('C:\\screenshot.jpg')
im = Image.open('C:\\screenshot.jpg')
# 用box裁剪出截图中验证码的所在区域
box = [100, 100, 200, 200] # 设置要裁剪的区域
region = im.crop(box) # 此时,region是一个新的图像对象
region.save('C:\\codeImage.jpg')
time.sleep(3) # 防止由于网速,可能图片还没保存好,就开始识别
im = Image.open('C:\\codeImage.jpg')
imgry = im.convert('L') # 图像加强,二值化
sharpness = ImageEnhance.Contrast(imgry) # 对比度增强
sharp_img = sharpness.enhance(2.0)
# 将处理后的验证码图片存在code.jpg中
sharp_img.save('C:\\code.jpg')
# sharp_img.show() #这是分布测试时候用的,整个程序使用需要注释掉
# 调用pytesser3方法,变量code即为识别出的图片数字str类型
code = pytesser3.image_file_to_string('C:\\code.jpg', graceful_errors=True)
print('code:' + code)
# 在页面的验证码输入框中输入识别出的code
code_input = driver.find_element_by_id('keyword2')
code_input.send_keys(code)
time.sleep(2)
# 然后进行搜索和后续操作
driver.find_element_by_class_name('search').click()
time.sleep(2)
# 如果验证码没有识别正确,可能会弹出提示框,这里我们需要对提示框进行处理
# 在页面中寻找提示框
res = EC.alert_is_present()(driver)
# 如果弹出提示框
if res:
# 点击提示框的确认,从新搜索一遍
res.accept()
time.sleep(5)
else:
# 说明已经识别成功并搜索成功,跳出循环进行下一步操作
accept = True
except UnicodeDecodeError:
accept = False
time.sleep(3)