python入門(mén)教程之識(shí)別驗(yàn)證碼
前言
驗(yàn)證碼?我也能破解?
關(guān)于驗(yàn)證碼的介紹就不多說(shuō)了,各種各樣的驗(yàn)證碼在人們生活中時(shí)不時(shí)就會(huì)冒出來(lái),身為學(xué)生日常接觸最多的就是教務(wù)處系統(tǒng)的驗(yàn)證碼了,比如如下的驗(yàn)證碼:
識(shí)別辦法
模擬登陸有著復(fù)雜的步驟,在這里咱們不管其他操作,只負(fù)責(zé)根據(jù)輸入的一張驗(yàn)證碼圖片返回一個(gè)答案字符串。
我們知道驗(yàn)證碼為了制作干擾,會(huì)把圖片弄成五顏六色的樣子,而我們首先就是要去除這些干擾,這一步就需要不斷試驗(yàn)了,增強(qiáng)圖片色彩,加大對(duì)比度等等都可以產(chǎn)生幫助。
在經(jīng)過(guò)各種對(duì)圖片的操作之后,終于找到了比較完美的去除干擾方案。可以看到在去除干擾之后,最優(yōu)情況下,我們將得到一張十分純凈的黑白字符圖片。一張圖片上有四個(gè)字符,沒(méi)辦法一下子就把四個(gè)字符全部識(shí)別,需要把圖片進(jìn)行裁剪,裁剪成每張小圖只有一個(gè)字符的樣子,再對(duì)每張圖片分別進(jìn)行識(shí)別。
接下來(lái)就是識(shí)別文字了,我們首先把得到的小圖轉(zhuǎn)換成01表示的矩陣,每個(gè)矩陣代表一個(gè)字符。
比如數(shù)字六的矩陣
num_6=[ 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,1,1,1,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,0,0,0,0, 0,1,1,0,0,0,0,1,1,1,0,0,0, 0,1,1,0,0,0,0,0,1,1,0,0,0, 0,1,1,0,0,0,0,0,1,1,0,0,0, 0,1,1,1,0,0,0,1,1,1,0,0,0, 0,0,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, ]
遠(yuǎn)遠(yuǎn)望過(guò)去,瞇著眼睛還是能分辨出來(lái)的。
因?yàn)轵?yàn)證碼十分規(guī)整,每個(gè)數(shù)字所在的位置都是固定的,所以并不需要涉及什么機(jī)器學(xué)習(xí)的算法,只是簡(jiǎn)單的進(jìn)行一下矩陣的比對(duì)就可以了,在所有的實(shí)現(xiàn)做好的矩陣中找到相似度最高的矩陣就可以了,在這里的比對(duì)方法多種多樣,反正數(shù)據(jù)簡(jiǎn)單能正確識(shí)別出來(lái)就好。
至此,咱們的驗(yàn)證碼識(shí)別工作就結(jié)束了。
這次進(jìn)行的驗(yàn)證碼識(shí)別主要采用python的PIL進(jìn)行圖片操作,模擬登陸自動(dòng)填寫(xiě)驗(yàn)證碼的全部代碼請(qǐng)看這里:
示例代碼
# -*- coding: utf-8 -* import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import re import requests import io import os import json from PIL import Image from PIL import ImageEnhance from bs4 import BeautifulSoup import mdata class Student: def __init__(self, user,password): self.user = str(user) self.password = str(password) self.s = requests.Session() def login(self): url = "http://202.118.31.197/ACTIONLOGON.APPPROCESS?mode=4" res = self.s.get(url).text imageUrl = 'http://202.118.31.197/'+re.findall('<img src="(.+?)" width="55"',res)[0] im = Image.open(io.BytesIO(self.s.get(imageUrl).content)) enhancer = ImageEnhance.Contrast(im) im = enhancer.enhance(7) x,y = im.size for i in range(y): for j in range(x): if (im.getpixel((j,i))!=(0,0,0)): im.putpixel((j,i),(255,255,255)) num = [6,19,32,45] verifyCode = "" for i in range(4): a = im.crop((num[i],0,num[i]+13,20)) l=[] x,y = a.size for i in range(y): for j in range(x): if (a.getpixel((j,i))==(0,0,0)): l.append(1) else: l.append(0) his=0 chrr=""; for i in mdata.data: r=0; for j in range(260): if(l[j]==mdata.data[i][j]): r+=1 if(r>his): his=r chrr=i verifyCode+=chrr # print "輔助輸入驗(yàn)證碼完畢:",verifyCode data= { 'WebUserNO':str(self.user), 'Password':str(self.password), 'Agnomen':verifyCode, } url = "http://202.118.31.197/ACTIONLOGON.APPPROCESS?mode=4" t = self.s.post(url,data=data).text if re.findall("images/Logout2",t)==[]: l = '[0,"'+re.findall('alert((.+?));',t)[1][1][2:-2]+'"]'+" "+self.user+" "+self.password+"\n" # print l # return '[0,"'+re.findall('alert((.+?));',t)[1][1][2:-2]+'"]' return [False,l] else: l = '登錄成功 '+re.findall('! (.+?) ',t)[0]+" "+self.user+" "+self.password+"\n" # print l return [True,l] def getInfo(self): imageUrl = 'http://202.118.31.197/ACTIONDSPUSERPHOTO.APPPROCESS' data = self.s.get('http://202.118.31.197/ACTIONQUERYBASESTUDENTINFO.APPPROCESS?mode=3').text #學(xué)籍信息 data = BeautifulSoup(data,"lxml") q = data.find_all("table",attrs={'align':"left"}) a = [] for i in q[0]: if type(i)==type(q[0]) : for j in i : if type(j) ==type(i): a.append(j.text) for i in q[1]: if type(i)==type(q[1]) : for j in i : if type(j) ==type(i): a.append(j.text) data = {} for i in range(1,len(a),2): data[a[i-1]]=a[i] # data['照片'] = io.BytesIO(self.s.get(imageUrl).content) return json.dumps(data) def getPic(self): imageUrl = 'http://202.118.31.197/ACTIONDSPUSERPHOTO.APPPROCESS' pic = Image.open(io.BytesIO(self.s.get(imageUrl).content)) return pic def getScore(self): score = self.s.get('http://202.118.31.197/ACTIONQUERYSTUDENTSCORE.APPPROCESS').text #成績(jī)單 score = BeautifulSoup(score, "lxml") q = score.find_all(attrs={'height':"36"})[0] point = q.text print point[point.find('平均學(xué)分績(jī)點(diǎn)'):] table = score.html.body.table people = table.find_all(attrs={'height' : '36'})[0].string r = table.find_all('table',attrs={'align' : 'left'})[0].find_all('tr') subject = [] lesson = [] for i in r[0]: if type(r[0])==type(i): subject.append(i.string) for i in r: k=0 temp = {} for j in i: if type(r[0])==type(j): temp[subject[k]] = j.string k+=1 lesson.append(temp) lesson.pop() lesson.pop(0) return json.dumps(lesson) def logoff(self): return self.s.get('http://202.118.31.197/ACTIONLOGOUT.APPPROCESS').text if __name__ == "__main__": a = Student(20150000,20150000) r = a.login() print r[1] if r[0]: r = json.loads(a.getScore()) for i in r: for j in i: print i[j], print q = json.loads(a.getInfo()) for i in q: print i,q[i] a.getPic().show() a.logoff()
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者使用python能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- python驗(yàn)證碼識(shí)別的實(shí)例詳解
- Python驗(yàn)證碼識(shí)別處理實(shí)例
- python驗(yàn)證碼識(shí)別教程之利用滴水算法分割圖片
- 詳解Python驗(yàn)證碼識(shí)別
- python簡(jiǎn)單驗(yàn)證碼識(shí)別的實(shí)現(xiàn)方法
- 用Python進(jìn)行簡(jiǎn)單圖像識(shí)別(驗(yàn)證碼)
- python腳本實(shí)現(xiàn)驗(yàn)證碼識(shí)別
- python爬蟲(chóng)之驗(yàn)證碼篇3-滑動(dòng)驗(yàn)證碼識(shí)別技術(shù)
- Python驗(yàn)證碼識(shí)別的方法
- python簡(jiǎn)單驗(yàn)證碼識(shí)別的實(shí)現(xiàn)過(guò)程
相關(guān)文章
python實(shí)現(xiàn)博客文章爬蟲(chóng)示例
簡(jiǎn)單的博客文章爬蟲(chóng),比較通用,因?yàn)榇蟛糠值木W(wǎng)站結(jié)構(gòu)都差不多,需要的朋友可以參考下2014-02-02python使用requests設(shè)置讀取超時(shí)時(shí)間
在Python中,使用requests庫(kù)進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),可以通過(guò)設(shè)置?timeout參數(shù)來(lái)指定讀取超時(shí)時(shí)間,本文就來(lái)介紹一下,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Python使用datetime庫(kù)實(shí)現(xiàn)對(duì)時(shí)間的獲取方法
這篇文章通過(guò)一個(gè)簡(jiǎn)單示例給大家介紹了Python如何使用datetime庫(kù)實(shí)現(xiàn)對(duì)時(shí)間的獲取方法,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11pandas通過(guò)字典生成dataframe的方法步驟
這篇文章主要介紹了pandas通過(guò)字典生成dataframe的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07對(duì)python cv2批量灰度圖片并保存的實(shí)例講解
今天小編就為大家分享一篇對(duì)python cv2批量灰度圖片并保存的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11python paramiko利用sftp上傳目錄到遠(yuǎn)程的實(shí)例
今天小編就為大家分享一篇python paramiko利用sftp上傳目錄到遠(yuǎn)程的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01一個(gè)計(jì)算身份證號(hào)碼校驗(yàn)位的Python小程序
閑著無(wú)事,便想寫(xiě)個(gè)實(shí)用點(diǎn)的Python小程序,如何計(jì)算機(jī)身份證號(hào)碼的校驗(yàn)位,這樣的文章在網(wǎng)上一抓一大把,這里僅簡(jiǎn)單介紹下吧2014-08-08