zoukankan      html  css  js  c++  java
  • Python爬虫入门教程 56-100 python爬虫高级技术之验证码篇2-开放平台OCR技术

    今日的验证码之旅

    今天你要学习的验证码采用通过第三方AI平台开放的OCR接口实现,OCR文字识别技术目前已经比较成熟了,而且第三方比较多,今天采用的是百度的。

    注册百度AI平台

    官方网址:http://ai.baidu.com/
    接下来申请
    python爬虫入门教程
    接下来创建一个简单应用之后,就可以使用了,我们找到
    python爬虫入门教程

    阅读文字识别相关文档

    你需要具备基本的阅读第三方文档的能力,打开我们需要的文档

    https://cloud.baidu.com/doc/OCR/OCR-API.html#.E9.80.9A.E7.94.A8.E6.96.87.E5.AD.97.E8.AF.86.E5.88.AB

    这个页面基本上已经把我们需要做的所有内容都已经标识清楚了

    编写获取accesstoken的代码

    在目前主流的API开发模式下,都是需要你进行accesstoken的获取的

    代码如下 ,重点需要参照文档进行传参的设计
    python验证码识别技术

        def get_accesstoken(self):
            res = requests.post(self.url.format(self.key,self.secret),headers=self.header)
            content = res.text
            if (content):
                return json.loads(content)["access_token"]
    

    得到accesstoken之后,你可以继续下面的操作

    import requests
    import json
    
    import base64
    
    import urllib.request, urllib.parse
    
    class GetCode(object):
    
        def __init__(self):
            self.url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}"
            self.api = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={}"
            self.header = {
                "Content-Type":'application/json; charset=UTF-8'
            }
    
            self.key = "你的KEY"
            self.secret = "你的SECRET"
    

    验证码识别阶段

    普通没有干扰的验证码,我们直接识别即可,但是有的验证码还是有干扰的,在识别之前,需要对它进行基本的处理,我们采用和上篇文章类似的办法进行,对它进行灰度处理和二值化操作。部分代码我直接硬编码了,不过最终识别的效果并没有比想象的优化多少。

     def init_table(self,threshold=155):
            table = []
            for i in range(256):
                if i < threshold:
                    table.append(0)
                else:
                    table.append(1)
            return table
    
    
    
        def opt_image(self):
            im = Image.open("66.png")
    
            im = im.convert('L')
            im = im.point(self.init_table(), '1')
            im.save('66_s.png')
            return "66_s.png"
    

    调用验证码接口

    调用百度的验证码接口,不使用百度给的模块直接编写。按照它对应的文档,书写即可。
    在这个地方尤其注意官方文档提示
    python验证码识别

        def get_file_content(self,file_path):
            with open(file_path, 'rb') as fp:
                base64_data = base64.b64encode(fp.read())
                s = base64_data.decode()
    
                data = {}
                data['image'] = s
    
                decoded_data = urllib.parse.urlencode(data)
                return decoded_data
    
    
        def show_code(self):
            image = self.get_file_content(self.opt_image())
            headers = {
                "Content-Type":	"application/x-www-form-urlencoded"
            }
            res = requests.post(self.api.format(self.get_accesstoken()),headers=headers,data=image)
            print(res.text)
    

    通过百度模块调用验证码识别

    安装百度AI

    pip install baidu-aip

    安装之后,就可以使用啦

    1. 声明一些常量,你在百度创建应用之后就可以获取
    2. 初始化文字识别类
    3. 调用对应的方法

    python验证码识别

    参考代码

    from aip import AipOcr
    
    
    # 定义常量
    APP_ID = '15736693'
    API_KEY = '你的KEY'
    SECRET_KEY = '你的SECRET'
    
    # 初始化文字识别
    aipOcr=AipOcr(APP_ID, API_KEY, SECRET_KEY)
    
    # 读取图片
    filePath = "1.jpg"
    
    def get_file_content(filePath):
        with open(filePath, 'rb') as fp:
            return fp.read()
    
    # 定义参数变量
    options = {
        'detect_direction': 'true',
        'language_type': 'CHN_ENG',
    }
    
    # 网络图片文字文字识别接口
    result = aipOcr.webImage(get_file_content(filePath),options)
    
    
    print(result)
    
    
    

    编码后记

    这种通过第三方OCR技术识别验证码的方式,本质上和上篇文章的原理是一致的
    在实测过程中发现,没有太多干扰线,搜狗腾讯有道 基本表现一致

    对于这种方式,学会即可~,道理都是一致的,当然你可以用Python实现一个图片转文字的小应用是没有任何问题的

    欢迎关注非本科程序员公众账号, 发送 ocr 获取源码
    非本科程序员

  • 相关阅读:
    邮箱整理
    C++ Primer Plus 6 笔记(1)
    MySQL的远程链接
    MySQL的安装和使用
    nginx的反向代理和负载均衡
    linux--配置开发环境 --Nginx篇
    linux--配置开发环境 --Apache篇
    Linux -- 运维
    Linux
    使用宝塔面板部署tp5网站
  • 原文地址:https://www.cnblogs.com/happymeng/p/10677730.html
Copyright © 2011-2022 走看看