zoukankan      html  css  js  c++  java
  • python爬虫20 | 小帅b教你如何使用python识别图片验证码

     

    当你在爬取某些网站的时候

     

    对于你的一些频繁请求

     

    对方会阻碍你

     

    常见的方式就是使用验证码

     

    验证码的主要功能

     

    就是区分你是人还是鬼(机器人)

     

     

    想法设法的搞一些手段来对付技术

     

     

    技术又能对付人们的想法

     

    一来一去

     

    就有了各种各样的变态验证码

     

    也有了各种各样的应对方式

     

    常见的验证码有这么几种

     

     

    图像验证

    语音验证

    短信验证

    极验验证

    点击验证

     

    今天

     

    小帅b想跟你先说说如何识别图像验证码

     

     

    那么

     

    接下来就是

     

    学习 python 的正确姿势

     

     

     

    我们来看看这些图片验证码

     

    (此图来源网络)

     

    可以发现

     

    这些验证码大多是数字和字母组成

     

    然后在此之上再添加一些像毛一样的线

     

    或者搞一些噪点

     

    或者把这些字符扭曲一下

     

    为了增加识别难度也是辛苦人家了

     

    接下来我们思考一下

     

    我们要识别这类验证码要怎么做呢

     

     

    首先要处理一下验证码图片

     

    什么噪点乱七八糟的

     

    我们尽量把它们去掉

     

    让图片

     

    尽量黑白

     

    尽量只剩下字符本身

     

    然后再用 python 强大的 OCR 工具

     

    Python-tesseract

     

     来识别我们优化好的图片

     

    这样正确率就会大大的提高

     

     

    哎呀

     

    我真是个聪明 boy 啊

     

     

    为了让你更清楚的知道怎么识别图像验证码

     

    小帅b用 python 搞了几张识别难度不同的验证码

     

     

    第一张

     

     

    难度系数: 

     

     

    第二张

     

     

    难度系数: 

     

     

    第三张

     

     

    难度系数: 

     

     

    第四张

     

     

    难度系数: 

     

     

    第五张

     

     

    难度系数 : 

     

     

    先对第一张进行识别

     

    这张看起来没什么 "污染"

     

    所以相对简单

     

    先安装一下  pytesseract 

        

    pip install pytesseract

     

    接着安装一下  tesseract-ocr

     

    如果你是 ubuntu 系统可以直接使用如下命令安装

     

    sudo apt install tesseract-ocr

     

    如果你是 win 系统自行 Google 一下安装  tesseract-ocr 以及环境变量配置

     

    完了之后就导入相关模块到我们的代码文件中

     

    try:    from PIL import Imageexcept ImportError:    import Imageimport pytesseract

     

    接着我们就打开第一张图片

     

    使用 pytesseract 识别

     

    打印一下

     

    captcha = Image.open("captcha1.png")result = pytesseract.image_to_string(captcha)print(result)

     

    打印结果

     

     

    ok,么有问题

     

     

    接着我们来识别第 2 张

     

     

    captcha = Image.open("claptcha2.png")result = pytesseract.image_to_string(captcha)print(result)

     

    结果打印出来是

     

     

    1924??

     

    这就说明

     

    pytesseract 是没办法识别太多噪点的图片的

     

    如果这个图片再加上一点彩色背景

     

     

    那么对 pytesseract 来说更是有点吃力的

     

    所以我们先对这张图片灰度处理一下

     

     

    captcha = Image.open("captcha2.png")result = captcha.convert('L')result.show()

     

    图片就变成灰了

     

     

    虽然灰了

     

    但是还不够

     

    我们除了处理灰度还需要对其 二值化

     

    def convert_img(img,threshold):    img = img.convert("L")  # 处理灰度    pixels = img.load()    for x in range(img.width):        for y in range(img.height):            if pixels[x, y] > threshold:                pixels[x, y] = 255            else:                pixels[x, y] = 0    return img

     

    调用一下

     

    convert_img(captcha,150)

     

    这时候图片就变成这样了

     

     

    是不是一下子就清晰很多了呢

     

    这时候我们对这张图片识别一下

     

    # 识别一下result = pytesseract.image_to_string(result)print(result)

     

    成功识别

     

     

     

    接下来我们再来看看有毛有噪的图片

     

     

    这时候直接去识别是识别不出来的

     

    所以还是老办法

     

    先处理灰度

     

    再 二值化

     

    这次我们再降一下噪

     

    data = img.getdata()    w,h = img.size    count = 0    for x in range(1,h-1):        for y in range(1, h - 1):            # 找出各个像素方向            mid_pixel = data[w * y + x]            if mid_pixel == 0:                top_pixel = data[w * (y - 1) + x]                left_pixel = data[w * y + (x - 1)]                down_pixel = data[w * (y + 1) + x]                right_pixel = data[w * y + (x + 1)]
    if top_pixel == 0: count += 1 if left_pixel == 0: count += 1 if down_pixel == 0: count += 1 if right_pixel == 0: count += 1 if count > 4: img.putpixel((x, y), 0)

     

    图片变成这样了

     

     

    再识别一下

     

     

     

     

     

    不过

     

    pytesseract 不是万能的

     

    对于稍微复杂一点的就识别不出来了

     

    至于这张

     

     

    你能看出它是 1l1l0oO0 么?

     

    如果你能

     

    算你牛逼

     

     

    反正小帅b不能

     

    所以 pytesseract 也不能

     

    对于一些简单的验证码

     

    使用 pytesseract 还是可以的

     

    如果你想提高 pytesseract 识别率

     

    还可以去搞些图片去训练一下 tesseract-ocr

     

     

    ok

     

    以上

     

    主要让你了解一下图片识别库的使用

     

    以及对一些图片的常用降噪操作

     

    那么下次你爬到一些需要图像的简单验证码

     

    应该不在话下了

     

     

    下回见

     

    听说你要 我啊!?

     

    peace

     

     

     

          点个在看啊~~(破音)

     

  • 相关阅读:
    软件开发流程概要(笔记)
    (转)HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
    (转)敏捷开发简介
    (转)从零开始学习ASP.NET MVC 1.0 (一) 开天辟地入门篇
    WinForm二三事(二)异步操作
    TSQL变量操作详解
    C#委托和多线程文章收藏
    psad, fwknop, 和fwsnort等著名开源安全软件的开发者谈Linux防火墙
    最通俗易懂的面向对象著作
    找到一本适合自己的SQL Server 2008入门书
  • 原文地址:https://www.cnblogs.com/fxxkpython/p/10832247.html
Copyright © 2011-2022 走看看