美文网首页
Python爬虫 | 普通验证码破解 tesserocr

Python爬虫 | 普通验证码破解 tesserocr

作者: 生信师姐 | 来源:发表于2020-05-11 09:06 被阅读0次

    验证码是众多网站采取的反爬措施。验证码的花样也很多,主要有下面这几种类验证码:
    图形验证码:数字、英文字母、混淆曲线组合成的验证码。
    行为验证码:识别文字,点击与文字相符的图片验证码。
    交互式验证码:极难滑动验证码,滑动拼合滑块方可完成验证。
    点触验证码:点击正确结果才可完成验证。
    还有滑动宫格验证码、计算题验证码等。

    下面涉及到的验证码有普通图形验证码、极验滑动验证码、点触验证码、微博宫格验证码。这些验证码识别方式和思路各有不同。通过了解这几种识别方式,可用类似方法识别其他类型验证码。

    tesserocr

    一些网站会在正常的账号密码认证之外加一些验证码,以此来明确的区分人/机行为,从一定程度上达到反爬的效果,对于简单的校验码Tesserocr就可以搞定

    图形验证码的识别

    知网注册页面就有类似的图形验证码:http://my.cnki.net/elibregister/commonRegister.aspx

    使用 OCR 技术识别图形验证码。需要安装的库是 tesserocr。

    先到知网注册页面下载验证码图片保存到本地,命名为 code.jpg,进行识别测试用。

    1、 识别测试
    将验证码图片放到程序所在的目录,用 tesserocr 库识别验证码,代码如下:

    import tesserocr
    from PIL import Image
    image = Image.open('code.jpg')
    result = tesserocr.image_to_text(image)
    print(result)
    

    运行代码输出为空,看来是没有成功识别验证码。
    使用 tesserocr 的一个简单方法直接图片文件转为字符串,代码如下所示:

    import tesserocr
    print(tesserocr.file_to_text('code.jpg'))
    

    此时识别到的结果是 SDIX,图片实际的验证码是 5DtX,识别效果不理想。
    2、 验证码处理
    由于验证码内有多余的线条干扰了图片的识别。需要做一些额外的处理才行,如转灰度、二值化等操作。
    将图片转化为灰度图像:Image对象的 convert() 方法传入参数 L 即可。

    image = image.convert('L')
    image.show() # 显示图片
    

    传入 1 可将图片进行二值化处理,如下所示:

    image = image.convert('1')
    image.show() # 显示图片
    

    还可以通过指定二值化的阈值。上面的方法是采用的默认阈值 127。这还不能直接转化原图,要将原图先转为灰度图像,然后再指定二值化阈值。代码如下所示:

    import tesserocr
    from PIL import Image
    
    image = Image.open('code.jpg')
    image = image.convert('L')
    threshold = 121
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    image = image.point(table, '1')
    #image.show()
    image.save('code3.jpg')
    # image = image.convert('1')
    #image.show()       # 显示图片
    result = tesserocr.image_to_text(image)
    print(result)
    

    调试各种参数,识别效果仍然不理想。

    相关文章

      网友评论

          本文标题:Python爬虫 | 普通验证码破解 tesserocr

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