JB的Python之旅-爬虫篇-图形验证码(2)-- 收费OCR了解下

前言

原本,计划这篇是讲讲怎么获取生成验证码的源码来反向获取验证码的,毕竟tesserocr的识别率有点感人,并且还须要调二值,一旦网站作了检验,好比同一个验证码重试几回不成功则拉黑或者更换新验证码,那就gg了;
但依然对图像识别放不了,这些玩意,明显是条财路啊,并且确定有解决方案,否则怎么会有打码平台?
这不,直接某度找收费OCR,一顿出来,top2个广告位就是放着百度跟腾讯的,当日往下翻,还有其余的不知名,为了安全起见,就介绍下BAT的;html

1.百度云OCR

官方接入文档: 文字识别-Python SDK接入文档python

重点:有免费服务
通用识别(包括身份证、银行卡)500次/日,
高精度则50次/日,
驾驶证,行驶证,车票,营业执照,通用票据均为200次/日
api

对于用来调试的脚本,500次足够了~
数组

对了,支持2.7.+及3.+;安全

1.2 配置流程:

1)先开通个百度的帐号;
2)开通文字识别服务,打开后点击当即使用:https://cloud.baidu.com/product/ocr.html
3)点击步骤2,应该有个信息确认的,确认后,会进入到用户我的首页,向下滑动,直接点击文字识别;网络

4)点击建立应用,输入一堆内容后,点击确认便可,而后点击个人应用,这里面的 API KeySecret Key须要使用到;

5)点击右上角,用户中心,用户ID也须要用到;

6)须要的信息准备好了, pip安装一波

pip install baidu-aip
复制代码

看到后面的success,good~app

1.3 体验一番:

from aip import AipOcr

""" 你的 APPID AK SK """
APP_ID = '你的APP ID'
API_KEY = '你的API KEY'
SECRET_KEY = '你的SECRET KEY'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

#读取图片
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

image = get_file_content('juejin.jpg')
""" 调用通用文字识别, 图片参数为本地图片 """
result = client.basicGeneral(image)

if 'words_result' in result:
    print(result)
复制代码

验证的图片以下:布局

结果走一波:网站

从结果看,都识别对了,牛逼啊,果真收费就是不同~
可是结果那,有2个words,但内容都是对的,从返回的结果,也不难分析出:
words_result_num是识别结果数;
words_result是定位和识别结果数组;
words是识别结果字符串阿里云

那若是要提炼下,则最后的print须要处理下~

#返回的格式
{'log_id': 8443096175124270990, 'words_result_num': 2, 'words_result': [{'words': '掘金'}, {'words': '首页沸点小册开源库活动'}]}


#直接把全部的words都拼接起来
''.join([w['words'] for w in result['words_result']])

#上面 这句话,也能够拆分红这样:

key = []

if 'words_result' in result:
    #先把words_result的内容提取出来
    for w in result["words_result"]:
        #在把words里面的内容提取出来
        key.append(w["words"])
#而后用join进行拼接
print("".join(key))
复制代码

ok,为了好看点,简单封装下,但遇到个问题:

提示没有APP_ID这个参数,这状况不对,由于这个名称是官网的例子;
官网的方式是传参,而咱们是封装好了,惟一的可能性,源码里面真不叫APP_ID;

ok,那就把参数都修改为appId,apiKey,secretKey,总体代码以下:

from aip import AipOcr

""" 你的 APPID AK SK """
config = {
    "appId": 'xxx',
    "apiKey":'xxx',
    "secretKey":'xxx'
}

client = AipOcr(**config)

""" 读取图片 """
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

def get_image_str(image_path):
    image = get_file_content(image_path)

    """ 调用通用文字识别, 图片参数为本地图片 """
    result = client.basicGeneral(image)

    #结果拼接返回输出
if 'words_result' in result:
    return ''.join([w['words'] for w in result['words_result']])

if __name__ == "__main__":
    print(get_image_str("juejin.jpg"))
复制代码

源码都在这里了,那咱们一块儿来看看,上篇微博那个验证码能识别出来吗?

1.4 验证码走一波

图1:

使用默认接口:

仍是有点异常,但基本是对的,那用下高精度的接口:

果真,高精度就准确了,怪不得天天只能免费50次;

图2:

高精度接口:

网络图片接口:

众接口尝试过,举例正常显示还差那么一点点;

图3:

高精度接口:

尝试其余接口,显示的内容都不搭边;
空心验证码,是要逆天啊~

最后,皮一张:

高精度接口:

内容不对,已经在预料以内了,但,貌似输出的结果,没有布局的概念???

怀着本能,想看看源码是怎么实现的,吊炸天了,结果一看:

图片变成BASE64处理的字符串,而后就发起了请求,再而后就是想到响应里面返回的内容:

1.5 百度云OCR总结

每日限量免费,并且仍是500次,这点很吸引人;
提供高精度的接口,中文辨识还能够;但图形验证码,尤为空心验证码基本失效;

关于原理嘛,找了半天也没找到半点消息,毕竟,人家是要收费的~

2 阿里云OCR

官方接入文档
https://help.aliyun.com/document_detail/50191.html?spm=a2c4g.11186623.6.618.UdvRRo

阿里也是有免费的,每月3K张;

支持的Python版本为2.7以上

2.2 配置流程

1)开通阿里云帐号
2)开通内容检测api:
https://www.aliyun.com/product/cdi/
3)开通后,登陆网站:
https://home.console.aliyun.com/new?spm=a2c4g.11186623.2.3.tZ4rrv#/
点击右上角用户中心,点击accesskeys,开通便可

4)pip安装一波:
默认用的是python3.X哈

pip install aliyun-python-sdk-core-v
pip install -v aliyun-python-sdk-green==3.1.0
复制代码

好了,接下来不介绍了,缘由嘛,官网信息比较乱,没有很好区分2.X跟3.X,致使跑起来一堆问题,白白浪费好几个小时~坑爹!!!

3 腾讯云OCR

每月免费1K条,不区分类型,只有常规的身份证,名片,驾驶证等;

官网接入文档
https://cloud.tencent.com/document/product/641/12440

3.2 配置流程

1)申请腾讯云帐号;
2)开通文字识别OCR权限:
https://cloud.tencent.com/product/ocr
3)开通后,登录下面的连接,点击新建密钥便可:
https://console.cloud.tencent.com/cam/capi

4)Bucket管理,打开连接,点击绑定Bucket,新建便可,要的是Bucket Name
https://console.cloud.tencent.com/ci/bucket

5)pip一下:

pip3 install qcloud_image
复制代码

3.3 初体验

from qcloud_image import Client
from qcloud_image import CIUrl, CIFile, CIBuffer, CIUrls, CIFiles, CIBuffers
appid = '你的appid'
secret_id = '你的secret_id'
secret_key = '你的secret_id'
bucket = '你的secret_id'
client = Client(appid, secret_id, secret_key, bucket)
client.use_http()
client.set_timeout(30)

print (client.namecard_detect(CIFiles(['ok.jpg'])))
复制代码

嗯,能执行起来,后台返回了:

{'result_list': [{'code': -5201, 'message': 'OCR_NOT_ENOUGH_TEXTLINES', 'filename': 'ok.jpg', 'data': {}}], 'httpcode': 400}
复制代码

可是没有找到比较详细的api文档,没办法分析,看官网信息,貌似还要本身写请求??也折腾了很多时间,不想折腾下去了,时间宝贵;

小结

本文结束了BAT3个平台的收费OCR,其中只有百度成功接入使用;
腾讯是由于API信息不太,致使能接入而且成功跑起来,可是不知道怎么处理;
阿里是由于文档上用的仍是2.X的,并且没有说明3.X怎么使用等状况,无法顺利跑起来

从免费上看,仍是百度大气,天天300条免费,腾讯跟阿里相对的,就少很对;
不过不得不说,百度的对于中文处理的太好了,基本都能识别到;

问题

既然是百度,对于空心的验证码,依然一筹莫展;
并且这仍是收费平台,难道就无法解决吗?

谢谢你们~

相关文章
相关标签/搜索