JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

jb發表於2018-06-11

前言

本來,計劃這篇是講講怎麼獲取生成驗證碼的原始碼來反向獲取驗證碼的,畢竟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,應該有個資訊確認的,確認後,會進入到使用者個人首頁,向下滑動,直接點選文字識別;

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
4)點選建立應用,輸入一堆內容後,點選確認即可,然後點選我的應用,這裡面的API KeySecret Key需要使用到;

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
5)點選右上角,使用者中心,使用者ID也需要用到;

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
6)需要的資訊準備好了,pip安裝一波

pip install baidu-aip
複製程式碼

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

看到後面的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)
複製程式碼

驗證的圖片如下:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

結果走一波:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

從結果看,都識別對了,牛逼啊,果然收費就是不一樣~
但是結果那,有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,為了好看點,簡單封裝下,但遇到個問題:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

提示沒有APP_ID這個引數,這情況不對,因為這個名稱是官網的例子;
官網的方式是傳參,而我們是封裝好了,唯一的可能性,原始碼裡面真不叫APP_ID;

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

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:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
使用預設介面:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
還是有點異常,但基本是對的,那用下高精度的介面:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

果然,高精度就準確了,怪不得每天只能免費50次;

圖2:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
高精度介面:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

網路圖片介面:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
眾介面嘗試過,舉例正常顯示還差那麼一點點;

圖3:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

高精度介面:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

嘗試其他介面,顯示的內容都不搭邊;
空心驗證碼,是要逆天啊~

最後,皮一張:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

高精度介面:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

內容不對,已經在預料之內了,但,貌似輸出的結果,沒有佈局的概念???

懷著本能,想看看原始碼是怎麼實現的,吊炸天了,結果一看:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

圖片變成BASE64處理的字串,然後就發起了請求,再然後就是想到響應裡面返回的內容:

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

1.5 百度雲OCR總結

每日限量免費,而且還是500次,這點很吸引人;
提供高精度的介面,中文辨識還可以;但圖形驗證碼,尤其空心驗證碼基本失效;

關於原理嘛,找了半天也沒找到半點訊息,畢竟,人家是要收費的~

2 阿里雲OCR

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

阿里也是有免費的,每個月3K張;

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

支援的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,開通即可

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
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

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
4)Bucket管理,開啟連結,點選繫結Bucket,新建即可,要的是Bucket Name
https://console.cloud.tencent.com/ci/bucket

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下
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條免費,騰訊跟阿里相對的,就少很對;
不過不得不說,百度的對於中文處理的太好了,基本都能識別到;

問題

既然是百度,對於空心的驗證碼,依然束手無策;
而且這還是收費平臺,難道就沒法解決嗎?

謝謝大家~

JB的Python之旅-爬蟲篇-圖形驗證碼(2)-- 收費OCR瞭解下

相關文章