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條免費,騰訊跟阿里相對的,就少很對;
不過不得不說,百度的對於中文處理的太好了,基本都能識別到;

問題

既然是百度,對於空心的驗證碼,依然一籌莫展;
並且這仍是收費平臺,難道就無法解決嗎?

謝謝你們~

相關文章
相關標籤/搜索