zoukankan      html  css  js  c++  java
  • 图形验证码的识别

    利用OCR技术识别图形验证码

    安装tesserocr

    识别测试

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

    也可以直接将图片文件转为字符串

    import tesserocr
    print(tesserocr.file_to_text("image.png"))
    

    验证码处理

    利用Image对象的convert()方法参数传入L,即可将图片转化为灰度图像

    image = image.convert("L")
    image.show()
    

    传入1可将图片进行二值化处理

    image = image.convert("1")
    image.show()
    

    先将原图转为灰度图像,然后再制定二值化阀值。变量 threshold 代表二值化阈值,阈值设置为 80。

    image = image.convert('L')
    threshold = 80
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    
    image = image.point(table, '1')
    image.show()
    

    原来验证码中的线条已经去除,整个验证码变得黑白分明。这时重新识别验证码

    import tesserocr
    from PIL import Image
    
    image = Image.open('code2.jpg')
    
    image = image.convert('L')
    threshold = 127
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    
    image = image.point(table, '1')
    result = tesserocr.image_to_text(image)
    print(result)
    

    利用专业打码平台识别验证码

    日常爬虫工作中,会遇到目标网站有图片验证码的反爬机制,除了手工配置识别图片外,为了提高效率,可以通过专业的打码平台来验证图片。这里用阿里云平台作为例子:

    在阿里云市场有很多专业打码商品

    https://market.aliyun.com/products/?keywords=%E5%9B%BE%E7%89%87%E8%AF%86%E5%88%AB%E9%AA%8C%E8%AF%81%E7%A0%81

    选购成功后,记下你的AppCode

    接下来开发代码逻辑:

    import urllib.request
    import ssl
    
    #修改API说明修改接口地址
    url = 'https://imgurlocr.market.alicloudapi.com/urlimages'
    method = 'POST'
    appcode = '你的AppCode'
    querys = ''
    bodys = {}
    
    
    bodys['image'] = '''https://fegine-drug.oss-cn-shanghai.aliyuncs.com/image/urlimage.png'''
    post_data = urllib.parse.urlencode(bodys).encode(encoding='UTF8')
    request = urllib.request.Request(url, post_data)
    #根据API的要求,定义相对应的Content-Type
    request.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
    request.add_header('Authorization', 'APPCODE ' + appcode)
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    response = urllib.request.urlopen(request, context=ctx)
    
    content = response.read()
    if (content):
        print(content.decode('UTF-8'))
    

    返回结果:

    {
      "code": "1",
      "msg": "查询成功",
      "result_num": 1,
      "result": [
        {
          "words": "给我跪下唱征服"
        }
      ]
    }
    
  • 相关阅读:
    Android系统介绍与框架(转)
    6个值得推荐的Android开源框架简介(转)
    程序员最喜爱的12个Android应用开发框架二(转)
    android在代码中四种设置控件(以及TextView的文字颜色)背景颜色的方法
    Android数据缓存(转)
    [UI]实用案例--Shape绘制实用圆圈
    接口API测试和返回值JSON解析的插件
    Android LayoutInflater详解(转)
    一个json字符串
    Android中设定EditText的输入长度(转)
  • 原文地址:https://www.cnblogs.com/hankleo/p/12359577.html
Copyright © 2011-2022 走看看