驗(yàn)證碼
驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫蹭越,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序也颤《焉可以防止:惡意破解密碼白华、刷票、論壇灌水方妖,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試匣缘,實(shí)際上用驗(yàn)證碼是現(xiàn)在很多網(wǎng)站通行的方式窘哈,我們利用比較簡(jiǎn)易的方式實(shí)現(xiàn)了這個(gè)功能澄成。這個(gè)問(wèn)題可以由計(jì)算機(jī)生成并評(píng)判胧洒,但是必須只有人類才能解答。由于計(jì)算機(jī)無(wú)法解答CAPTCHA的問(wèn)題墨状,所以回答出問(wèn)題的用戶就可以被認(rèn)為是人類卫漫。
驗(yàn)證碼通常用于網(wǎng)站的登錄,以區(qū)分是否是人類的行為還是機(jī)器的行為肾砂。啟用驗(yàn)證碼是反爬蟲列赎、反黑客的常用手段之一。然而通今,隨著技術(shù)的不斷進(jìn)步粥谬,特別是machine learning的發(fā)展肛根,普通的驗(yàn)證碼識(shí)別也不是很復(fù)雜的事情辫塌。
識(shí)別驗(yàn)證碼的架構(gòu)
在搭建識(shí)別驗(yàn)證碼服務(wù)之前需要完成兩件事情。
1)使用現(xiàn)有的爬蟲采集好圖片驗(yàn)證碼派哲,并標(biāo)注好這些圖片臼氨。這里,我使用自己開發(fā)的圖片爬蟲程序PicCrawler芭届。所謂標(biāo)注储矩,就是用肉眼去正確地識(shí)別出圖片中的數(shù)字和字母感耙,然后用這些數(shù)字和字母作為圖片的名字。
2)使用tensorflow來(lái)訓(xùn)練這些驗(yàn)證碼生成模型持隧,每一批的驗(yàn)證碼至少幾千起即硼。這樣,訓(xùn)練好的模型可以通過(guò)tensorflow的api來(lái)加載屡拨。
做完這些事情之后只酥,需要考慮使用怎樣的方式整合到現(xiàn)有的框架中。
-
最初的架構(gòu)
最初的架構(gòu).png
最初考慮使用OpenCV來(lái)加載模型呀狼,因?yàn)镺penCV有Java的API裂允。然后Vert.x跟OpenCV進(jìn)行交互。在這個(gè)架構(gòu)中有線上的模型和離線的模型哥艇,線上的模型是生產(chǎn)環(huán)境中使用的模型绝编。每次訓(xùn)練好的離線模型可以替換線上的模型。但是OpenCV加載模型時(shí)遇到了問(wèn)題貌踏,于是嘗試另一種辦法十饥。
-
后來(lái)的嘗試
后來(lái)的嘗試.png
用tensorflow java api替換OpenCV來(lái)加載模型,這種方式也遇到了問(wèn)題祖乳,不得不使用最后的方式绷跑。
-
最終的架構(gòu)
最終的架構(gòu).png
使用python的web框架flask以及tensorflow python api來(lái)加載模型。在這個(gè)架構(gòu)中凡资,需要Vert.x調(diào)用flask暴露的接口砸捏,最后將識(shí)別的結(jié)果返回。
最終隙赁,接口返回的數(shù)據(jù)跟圖片中驗(yàn)證碼的內(nèi)容一致垦藏。算是完成了一次驗(yàn)證碼的識(shí)別。
思考
目前伞访,只能識(shí)別1掂骏、2種驗(yàn)證碼,未來(lái)會(huì)將多種驗(yàn)證碼進(jìn)行打標(biāo)簽厚掷,然后訓(xùn)練到一個(gè)模型中弟灼。
驗(yàn)證碼的功能打算整合到爬蟲框架NetDiscovery中,成為它的一個(gè)組件冒黑。由于爬蟲框架是開源的田绑,所以大家都可以免費(fèi)使用這個(gè)模塊。
驗(yàn)證碼模塊的架構(gòu)抡爹,也爭(zhēng)取使用熟悉的Java來(lái)替換python掩驱。