Py学习  »  Python

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

jb • 5 年前 • 533 次点击  

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

前言

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

1.百度云OCR

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

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

对于用来调试的脚本,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~

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条免费,腾讯跟阿里相对的,就少很对;
不过不得不说,百度的对于中文处理的太好了,基本都能识别到;

问题

既然是百度,对于空心的验证码,依然束手无策;
而且这还是收费平台,难道就没法解决吗?

请留意下篇的:
如何获取验证码的生成代码二次处理获取验证码

谢谢大家~


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/tDcQX7jrMt
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13403
 
533 次点击