驗證碼(CAPTCHA)是「Completely Automated Public Turing test to tell Computers and Humans Apart」(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機仍是人的公共全自動程序。能夠防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定註冊用戶用特定程序暴力破解方式進行不斷的登錄嘗試,實際上用驗證碼是如今不少網站通行的方式,咱們利用比較簡易的方式實現了這個功能。這個問題能夠由計算機生成並評判,可是必須只有人類才能解答。因爲計算機沒法解答CAPTCHA的問題,因此回答出問題的用戶就能夠被認爲是人類。java
驗證碼一般用於網站的登陸,以區分是不是人類的行爲仍是機器的行爲。啓用驗證碼是反爬蟲、反黑客的經常使用手段之一。然而,隨着技術的不斷進步,特別是machine learning的發展,普通的驗證碼識別也不是很複雜的事情。python
在搭建識別驗證碼服務以前須要完成兩件事情。 1)使用現有的爬蟲採集好圖片驗證碼,並標註好這些圖片。這裏,我使用本身開發的圖片爬蟲程序PicCrawler。所謂標註,就是用肉眼去正確地識別出圖片中的數字和字母,而後用這些數字和字母做爲圖片的名字。git
2)使用tensorflow來訓練這些驗證碼生成模型,每一批的驗證碼至少幾千起。這樣,訓練好的模型能夠經過tensorflow的api來加載。github
作完這些事情以後,須要考慮使用怎樣的方式整合到現有的框架中。web
最初的架構 flask
最初考慮使用OpenCV來加載模型,由於OpenCV有Java的API。而後Vert.x跟OpenCV進行交互。在這個架構中有線上的模型和離線的模型,線上的模型是生產環境中使用的模型。每次訓練好的離線模型能夠替換線上的模型。可是OpenCV加載模型時遇到了問題,因而嘗試另外一種辦法。後來的嘗試 api
用tensorflow java api替換OpenCV來加載模型,這種方式也遇到了問題,不得不使用最後的方式。架構
使用python的web框架flask以及tensorflow python api來加載模型。在這個架構中,須要Vert.x調用flask暴露的接口,最後將識別的結果返回。框架
最終,接口返回的數據跟圖片中驗證碼的內容一致。算是完成了一次驗證碼的識別。測試
目前,只能識別一、2種驗證碼,將來會將多種驗證碼進行打標籤,而後訓練到一個模型中。
驗證碼的功能打算整合到爬蟲框架NetDiscovery中,成爲它的一個組件。因爲爬蟲框架是開源的,因此你們均可以避免費使用這個模塊。
驗證碼模塊的架構,也爭取使用熟悉的Java來替換python。