selenium - 图形验证码

前言:用selenium做UI自动化,遇网站登录需要验证码!?WC...看了很多文章,最终解决不了我的需求,故做一下记录分享我的解决方法

 

1.主要思路:

①.通过元素定位验证码图片位置

②.使用screenshot方法将验证码截图

③.将图片亮度对比度调高提高识别精准度

④.使用ddddoc第三方库识别验证码

 

2.元素定位

复制xpath定位验证码图片并截图命名img.png

img=driver.find_element_by_xpath('//*[@id="login-form"]/div[4]/span')
img.screenshot('E:\\captcha\\img.png')

 

 

3.提高亮度或对比度去除干扰因素

python中PIL模块中有一个叫做ImageEnhance的类,该类专门用于图像的增强处理,可以实现图像的亮度、对比度、色度和锐度四种方式的增强(或减弱)处理。

# -*- coding: UTF-8 -*-
import os
from PIL import Image
from PIL import ImageEnhance
import ddddocr

# 原始图像
class ImageAugument(object):
    def __init__(self,img_name):
        image = Image.open('E:\\captcha\\'+img_name)
        self.Image = image.convert('L')     #转化为灰色图像

        # image.show()

    # 亮度增强
    def Brightness_img(self):
        enh_bri = ImageEnhance.Brightness(self.Image )
        brightness = 1.4
        image_brightened = enh_bri.enhance(brightness)
        image_brightened.save('E:\\captcha\\aa.png')

    # 色度增强
    def Color_img(self):
        enh_col = ImageEnhance.Color(self.Image )
        color = 1.5
        image_colored = enh_col.enhance(color)
        image_colored.save('E:\\captcha\\bb.png')

    # 对比度增强
    def Contrast_img(self):
        enh_con = ImageEnhance.Contrast(self.Image )
        contrast = 1.5
        image_contrasted = enh_con.enhance(contrast)
        image_contrasted.save('E:\\captcha\\cc.png')

    # 锐度增强
    def Sharpness_img(self):
        enh_sha = ImageEnhance.Sharpness(self.Image )
        sharpness = 3.0
        image_sharped = enh_sha.enhance(sharpness)
        image_sharped.save('E:\\captcha\\dd.png')

    # 亮度增强对比度增强
    def Brightness_And_Contrast_img(self):
        enh_bri = ImageEnhance.Brightness(self.Image)
        brightness = 1.4
        image_brightened = enh_bri.enhance(brightness)
        enh_con = ImageEnhance.Contrast(image_brightened)
        contrast = 1.5
        image_contrasted = enh_con.enhance(contrast)
        image_contrasted.save('E:\\captcha\\Ee.png')

if __name__ == '__main__':
    img_x = ImageAugument('img.png')
    img_x.Brightness_And_Contrast_img()

 

具体数值可以通过aa bb cc dd去查看哪张图验证码更清晰,参数可自行调整

 

4.使用第三方库识别图片中的验证码:

博猪最开始用:pillow+pytesseract;优点是免费,较为易用,但其识别精度一般。

但是!我发现了一个第三方库,该库名也是非常有趣 —— ddddocr(谐音带带弟弟OCR)

Github地址:https://github.com/sml2h3/ddddocr

环境要求

python >= 3.8

Windows/Linux/Macox..

可以通过pip命令安装:pip install ddddocr -i https://pypi.douban.com/simple

以下是代码,五行识别验证码

import ddddocr

ocr = ddddocr.DdddOcr()
with open('1.png', 'rb') as f:
    img_bytes = f.read()
res = ocr.classification(img_bytes)

print(res)

 

posted @ 2022-03-29 16:11  小林同学_Scorpio  阅读(1060)  评论(0编辑  收藏  举报
1