用python识别验证码

作者: 浪晋 | 来源:发表于2017-12-03 15:00 被阅读553次

    前言

    经常大家在做自动化测试或者做网络爬虫的时候,都很容易遇到验证码。
    今天,我们就简单的说下,怎么用python来处理验证码。
    (注意:我所有的python相关的文章用的都是python3。)

    准备工作

    1、tesseract-ocr软件

    Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封。
    数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。
    总之,tesseract-ocr是一个做图形识别必须用到第一个软件,不仅可以处理验证码,也可以识别图片上的文字等等。

    我已经把软件上传了我的网盘,大家可以直接下载,不需要安装,解压即可。
    下载地址:
    链接:https://pan.baidu.com/s/1bpMz3OV 密码:108a

    2、Pytesseract包

    Pytesseract是一个python的第三方的包,主要作用就是用来连接操作tesseract-ocr工具。
    为我们用python来处理图形打好了基础。
    可以使用pip工具直接安装。

    3、Pillow包

    python的图形处理库,用来处理调整图形的各种内容。
    Pillow由PIL而来,所以该导入该库使用import PIL。
    Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。
    可以使用pip工具直接安装。

    配置环境

    第一步、把Tesseract-OCR添加到环境变量。

    我们下载好Tesseract-OCR后,直接将其解压,然后把所在路径添加到环境变量中。
    如图所示:


    Tesseract路径.png

    复制路径:D:\Program Files\Tesseract-OCR
    添加到环境变量PATH中


    环境变量.png

    第二步、安装Pytesseract和Pilllow包

    打开cmd,使用pip工具依次安装Pytesseract和Pilllow包
    如图所示:


    pytesseract.gif

    第三步、检查是否安装成功

    1、检查tesseract-ocr
    打开cmd,输入tesseract


    image.png

    2、检查Pytesseract和Pillow包
    在python里导入试试吧,没有报错,那就说明成功了。


    image.png
    OK!没问题,说明我们已经安装成功了,那我们就开始写代码了。

    识别验证码

    要识别验证码,那我们首先就要获取验证码。
    我一般有两种常用的方式去获取验证码。
    第一种是通过接口保存验证码。
    第二种是通过截图保存验证码。
    我们依次说明。

    1、通过接口保存验证码并识别。

    通过接口去获取的话,我们是需要借助requests这个包的。
    这里我们主要讲识别验证码,requests我会在其他文章里详细的说明。

    import requests
    import pytesseract
    from PIL import Image
    '''
    调用接口请求验证码,保存到本地,识别验证,检查识别的验证码对不对。
    '''
    # 获取图片的接口地址
    url = hurl + "/file/getCaptcha1"
    # headers需要的参数
    headers = None
    # 接口需要的参数
    querystring = {"w": "70", "h": "29"}
    # 发送请求
    response = requests.request("GET", url, headers=headers, params=querystring, verify=False)
    # 接口返回的数据以二进制的方式展示
    img = response.content
    # 选择保存的路径和图片格式
    with open('F:\MyPython\TestCode\data\code.jpg', 'wb') as f:
        # 保存
        f.write(img)
    # 用Image模块打开上一步保存的验证码
    image = Image.open('F:\MyPython\TestCode\data\code.jpg')
    # 识别验证码
    optCode = pytesseract.image_to_string(image)
    # 打印出验证码
    print("验证码:", optCode)
    

    2、通过截图保存验证码并识别。

    要截图的话肯定需要界面,那么我们就需要借助selenium去操作了。
    selenium这里也不讲,大家应该都会吧。

    import pytesseract
    from PIL import Image
    from selenium import webdriver
    '''
    调用接口请求验证码,保存到本地,识别验证,检查识别的验证码对不对。
    '''
    driver = webdriver.Chrome()
    打开有验证码的界面
    driver.get("https://www.XXXX.com/login")
    # 比较好理解、截图并保存到这个路径
    driver.get_screenshot_as_file('F:/VScode/LoarRunner/Vcode/homepage.png')
    # 打开刚刚保存的图片
    im = Image.open('F:/VScode/LoarRunner/Vcode/homepage.png')
    # 设置要裁剪的区域(验证码所在的区域)
    box = (1214, 82, 1285, 111)
    # 截图,生成只有验证码的图片
    region = im.crop(box)
    # 保存到本地路径
    region.save("F:/VScode/LoarRunner/Vcode/image_code.jpg")
    # 读取验证码图片
    image = Image.open("F:/VScode/LoarRunner/Vcode/image_code.jpg")
    # 开始识别验证码
    optCode = pytesseract.image_to_string(image)
    # 打印出验证码
    print(optCode)
    

    总结

    简单的来说,识别图片,验证码,文字啊,都可以这样子操作。
    但是验证码的处理远远没有这么简单。
    毕竟啊,现在的验证码是越来越变态。
    希望大家可以灵活应用图形处理方法。
    可以尝试下识别照片上的文字什么的。

    相关文章

      网友评论

        本文标题:用python识别验证码

        本文链接:https://www.haomeiwen.com/subject/bklobxtx.html