Python3實(shí)現(xiàn)的簡(jiǎn)單驗(yàn)證碼識(shí)別功能示例
本文實(shí)例講述了Python3實(shí)現(xiàn)的簡(jiǎn)單驗(yàn)證碼識(shí)別功能。分享給大家供大家參考,具體如下:
這次的需求是自動(dòng)登錄某機(jī)構(gòu)網(wǎng)站, 其驗(yàn)證碼很具特色, 很適合做驗(yàn)證碼識(shí)別入門(mén)demo, 先貼主要代碼, 其中圖片對(duì)比使用了編輯距離算法, 腳本使用了pillow庫(kù)
from PIL import Image
import requests
import re
splitter = re.compile(r'\d{30}') # 分割二值化后的圖片
# distance('11110000', '00000000')
# 比較兩個(gè)字符串有多少位不同, 返回不同的位數(shù)
def distance(string1, string2):
d_str1 = len(string1)
d_str2 = len(string2)
d_arr = [[0] * d_str2 for i in range(d_str1)]
for i in range(d_str1):
for j in range(d_str2):
if string1[i] == string2[j]:
if i == 0 and j == 0:
d_arr[i][j] = 0
elif i != 0 and j == 0:
d_arr[i][j] = d_arr[i - 1][j]
elif i == 0 and j != 0:
d_arr[i][j] = d_arr[i][j - 1]
else:
d_arr[i][j] = d_arr[i - 1][j - 1]
else:
if i == 0 and j == 0:
d_arr[i][j] = 1
elif i != 0 and j == 0:
d_arr[i][j] = d_arr[i - 1][j] + 1
elif i == 0 and j != 0:
d_arr[i][j] = d_arr[i][j - 1] + 1
else:
d_arr[i][j] = min(d_arr[i][j - 1], d_arr[i - 1][j], d_arr[i - 1][j - 1]) + 1
current = max(d_arr[d_str1 - 1][d_str2 - 1], abs(d_str2 - d_str1))
# print("Levenshtein Distance is",current)
# print(current)
return current
# 去除字符串里面連續(xù)的1
def no_one(string):
n_arr = splitter.findall(string)
n_arr = filter(lambda each_str: each_str != '111111111111111111111111111111', n_arr)
n_result = ''
for n_each in n_arr:
n_result += str(n_each)
return n_result
opener = requests.session()
res = opener.get('http://60.211.254.236:8402/Ajax/ValidCodeImg.ashx').content
with open('verify.gif', 'wb') as v:
v.write(res)
img = Image.open('verify.gif')
img = img.convert('L')
size = img.size
# img = img.point(table, '1')
img_arr = img.load()
# for x in range(size[0]):
# for y in range(size[1]):
# if img_arr[x, y] > 210:
# img_arr[x, y] = 1
# else:
# img_arr[x, y] = 0
# img.save('after.gif')
inc = 0
str1 = ''
str2 = ''
str3 = ''
cur_str = ''
for x in range(size[0]):
for y in range(size[1]):
if img_arr[x, y] > 210:
cur_str += '1'
else:
cur_str += '0'
# print(img_arr[i, j], end='')
# cur_str += str(img_arr[x, y])
inc += 1
# if inc % 18 == 0:
# print('\n----')
# else:
# print('')
if inc == 18:
str1 = cur_str
cur_str = ''
elif inc == 36:
str2 = cur_str
cur_str = ''
elif inc == 54:
str3 = cur_str
cur_str = ''
str1 = str1[:-60]
str2 = str2[:-60]
str3 = str3[:-60]
str1 = no_one(str1)
str2 = no_one(str2)
str3 = no_one(str3)
str1 = str1.strip('1')
str2 = str2.strip('1')
str3 = str3.strip('1')
# print(str1)
# print(str3)
with open('./dict/plus') as plus:
with open('./dict/minus') as minus:
p = plus.read()
m = minus.read()
is_add = 1 if distance(p, str2) < distance(m, str2) else 0
arr1 = []
arr3 = []
for each in range(1, 10):
with open('./dict/{}'.format(each)) as f:
ff = f.read()
arr1.append([each, distance(ff, str1)])
arr3.append([each, distance(ff, str3)])
arr1 = sorted(arr1, key=lambda item: item[1])
arr3 = sorted(arr3, key=lambda item: item[1])
result = arr1[0][0] + arr3[0][0] if is_add else arr1[0][0] - arr3[0][0]
print(result)
# login_url = 'http://60.211.254.236:8402/Ajax/Login.ashx?Method=G3_Login'
# login_data = {
# 'loginname': usn,
# 'password': pwd,
# 'validcode': result,
#
# }
# opener.get(login_url, login_data)
字庫(kù)已經(jīng)部署到GitHub地址:https://github.com/hldh214/validCode/
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python圖片操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- python驗(yàn)證碼識(shí)別的實(shí)例詳解
- python下調(diào)用pytesseract識(shí)別某網(wǎng)站驗(yàn)證碼的實(shí)現(xiàn)方法
- Python驗(yàn)證碼識(shí)別處理實(shí)例
- Python網(wǎng)站驗(yàn)證碼識(shí)別
- python+selenium識(shí)別驗(yàn)證碼并登錄的示例代碼
- Python+Selenium+PIL+Tesseract自動(dòng)識(shí)別驗(yàn)證碼進(jìn)行一鍵登錄
- 用Python進(jìn)行簡(jiǎn)單圖像識(shí)別(驗(yàn)證碼)
- Python2.7+pytesser實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼的識(shí)別方法
- python使用tensorflow深度學(xué)習(xí)識(shí)別驗(yàn)證碼
- Python用 KNN 進(jìn)行驗(yàn)證碼識(shí)別的實(shí)現(xiàn)方法
相關(guān)文章
Python的條件語(yǔ)句與運(yùn)算符優(yōu)先級(jí)詳解
這篇文章主要介紹了Python的條件語(yǔ)句與運(yùn)算符優(yōu)先級(jí),是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
Python讀取HTML中的canvas并且以圖片形式存入Word文檔
這篇文章主要介紹了Python讀取HTML中的canvas并且以圖片形式存入Word文檔,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
python3連接MySQL數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了python3連接MySQL數(shù)據(jù)庫(kù)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Python超簡(jiǎn)單容易上手的畫(huà)圖工具庫(kù)推薦
今天小編給大家分享一款很棒的python畫(huà)圖工具庫(kù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-05-05
Python多線(xiàn)程編程之threading模塊詳解
這篇文章主要介紹了Python多線(xiàn)程編程之threading模塊詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
詳解MySQL數(shù)據(jù)類(lèi)型int(M)中M的含義
int(M)拆分來(lái)說(shuō),int是代表整型數(shù)據(jù)那,么中間的M應(yīng)該是代表多少位了,后來(lái)查mysql手冊(cè)也得知了我的理解是正確的,下面這篇文章小編就來(lái)舉例詳細(xì)說(shuō)明。 文中介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面就來(lái)學(xué)習(xí)學(xué)習(xí)吧。2016-11-11

