python+selenium2自动化---使用pytesseract和Pillow实现验证码识别
这种方式只能对简单的验证码起作用,复杂的就获取不到了。
验证码识别思路:
1、获取整个屏幕截图
2、获取验证码图片的坐标
3、抠图获取验证码图片
4、使用pytesseract识别验证码
示例代码
import os
from time import sleep
import pytesseract
from selenium import webdriver
from PIL import Image
class TestCase():
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('http://es.bnuz.edu.cn/')
def test01(self):
#获取屏幕截图
self.driver.get_screenshot_as_file(os.path.dirname(__file__)+'/屏幕截图.png')
#获取验证码图片元素
ele = self.driver.find_element_by_xpath('//*[@id="yzm_dd"]/img')
#获取验证码图片左上角的坐标
location = ele.location
size = ele.size
print(location)
print(size)
#验证码图片的大小
left = location['x']
top = location['y']
right = size['width'] + left
height = size['height'] + top
#如果是retina屏幕,需要这样
dpr = self.driver.execute_script('return window.devicePixelRatio')
#抠图获取验证码图片
im = Image.open(os.path.dirname(__file__)+'/屏幕截图.png')
im_new = im.crop((left*dpr,top*dpr,right*dpr,height*dpr))
im_new.save(os.path.dirname(__file__)+'/验证码图片.png')
sleep(3)
self.driver.quit()
def test02():
img = Image.open(os.path.dirname(__file__)+'/验证码图片.png')
res = pytesseract.image_to_string(img)
print(res)
if __name__ == '__main__':
TestCase.test02()
获取到的整个屏幕截图:
验证码图片:
输出结果: