之前做了一個校園交友的APP,其中一個邏輯是通過用戶的教務系統來確認用戶是一名在校大學生,基本的想法是通過用戶的賬號和密碼,用爬蟲的方法來確認信息,但是許多教務系統都有驗證碼,當時是通過本地服務器去下載驗證碼,然后分發給客戶端,然后讓用戶自己填寫驗證碼,與賬號密碼一并提交給服務器,然后服務器再去模擬登錄教務系統以確認用戶能否登錄該教務系統。驗證碼無疑讓我們想使得用戶快速認證的想法破滅了,但是當時也沒辦法,最近看了一些機器學習的內容,覺得對于大多數學校的那些極簡單的驗證碼應該是可以用KNN這種方法來破解的,于是整理了一下思緒,擼起袖子做起來!
我們學校的驗證碼是這樣的:
,其實就是簡單地把字符進行旋轉然后加上一些微弱的噪點形成的。我們要識別,就得逆行之,具體思路就是,首先二值化去掉噪點,然后把單個字符分割出來,最后旋轉至標準方向,然后從這些處理好的圖片中選出模板,最后每次新來一張驗證碼就按相同方式處理,然后和這些模板進行比較,選擇判別距離最近的一個模板作為其判斷結果(亦即KNN的思想,本文取K=1)。接下來按步驟進行說明。
首先得有大量的驗證碼,我們通過爬蟲來實現,代碼如下
#-*- coding:UTF-8 -*-import urllib,urllib2,cookielib,string,Imagedef getchk(number): #創建cookie對象 cookie = cookielib.LWPCookieJar() cookieSupport= urllib2.HTTPCookieProcessor(cookie) opener = urllib2.build_opener(cookieSupport, urllib2.HTTPHandler) urllib2.install_opener(opener) #首次與教務系統鏈接獲得cookie# #偽裝browser headers = { 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding':'gzip,deflate', 'Accept-Language':'zh-CN,zh;q=0.8', 'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36' } req0 = urllib2.Request( url ='http://mis.teach.ustc.edu.cn', headers = headers #請求頭 ) # 捕捉http錯誤 try : result0 = urllib2.urlopen(req0) except urllib2.HTTPError,e: print e.code #提取cookie getcookie = ['',] for item in cookie: getcookie.append(item.name) getcookie.append("=") getcookie.append(item.value) getcookie = "".join(getcookie) #修改headers headers["Origin"] = "http://mis.teach.ustc.edu.cn" headers["Referer"] = "http://mis.teach.ustc.edu.cn/userinit.do" headers["Content-Type"] = "application/x-www-form-urlencoded" headers["Cookie"] = getcookie for i in range(number): req = urllib2.Request( url ="http://mis.teach.ustc.edu.cn/randomImage.do?date='1469451446894'", headers = headers #請求頭 ) response = urllib2.urlopen(req) status = response.getcode() picData = response.read() if status == 200: localPic = open("./source/"+str(i)+".jpg", "wb") localPic.write(picData) localPic.close() else: print "failed to get Check Code "if __name__ == '__main__': getchk(500)
|
新聞熱點
疑難解答