爬蟲(chóng)程序會(huì)遇到各色各樣的驗(yàn)證碼,整理一下解決方法。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括房縣網(wǎng)站建設(shè)、房縣網(wǎng)站制作、房縣網(wǎng)頁(yè)制作以及房縣網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,房縣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到房縣省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!
原理是根據(jù)像素平均值對(duì)比,來(lái)得到一串0這樣的字符串,通過(guò)比較相同位置上是否相同。
統(tǒng)計(jì)出來(lái)的數(shù)量作為相似度憑據(jù)。
適用于不規(guī)則,難以識(shí)別文字或字母時(shí)的圖像對(duì)比,適用面不廣,但思路可以借鑒。
代碼如下:
#開(kāi)發(fā)時(shí)間: 2022/11/2 20:42
import cv2
from PIL import Image
import numpy as np
#改這里?。?!
path = r"E:\pic\123\8.jpg"#要識(shí)別的主圖像
path8 = r"E:\pic\123"#這里存放那0-7編號(hào)的八張圖片所在文件夾地址,不需要加\,如E:\pic
#均值哈希算法
def aHash(img):
image = cv2.imread(img)
# 縮放為10*10
img = cv2.resize(image, (10, 10))
# 轉(zhuǎn)換為灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# s為像素和初值為0,hash_str為hash值初值為''
s = 0
hash_str = ''
# 遍歷累加求像素和
for i in range(10):
for j in range(10):
s = s + gray[i, j]
# 求平均灰度
avg = s / 100
# 灰度大于平均值為1相反為0生成圖片的hash值
for i in range(10):
for j in range(10):
if gray[i, j] > avg:
hash_str = hash_str + '1'
else:
hash_str = hash_str + '0'
return hash_str
def cmpHash(hash1, hash2):
n = 0
# hash長(zhǎng)度不同則返回-1代表傳參出錯(cuò)
if len(hash1)!=len(hash2):
return -1
# 遍歷判斷
for i in range(len(hash1)):
# 不相等則n計(jì)數(shù)+1,n最終為相似度
if hash1[i] != hash2[i]:
n = n + 1
return n
def chanese2num(image1):
hash1 = aHash(image1)
n1 = 0
for i in range(8):
image2 = path8+ "/" +str(i) + ".jpg"
blackwhite(image2, 0)
hash2 = aHash(image2)
n = 100 - cmpHash(hash1, hash2)
# print(n,i)#調(diào)試用
if n >= n1:
n1 = n
num = i
return num
def blackwhite(input_img_file,flag):
"""
轉(zhuǎn)化為二值圖像
"""
img = Image.open(input_img_file)
# 模式L”為灰色圖像,它的每個(gè)像素用8個(gè)bit表示,0表示黑,255表示白,其他數(shù)字表示不同的灰度。
Img = img.convert('L')
table = []
if flag == 0:
#處理藍(lán)底白字
threshold = 180
for i in range(256):
if i < threshold:
table.append(1)
else:
table.append(0)
photo = Img.point(table, '1')
photo.save(input_img_file)
if flag == 1:
#處理白底紅字
threshold = 228
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
photo = Img.point(table, '1')
photo.save(r"E:\pic\123/test.jpg")
def main():
image = cv2.imread(path)
image = np.array(image)
frame1 = image[2:32, 140:211]#裁剪圖像,必須在opencv的數(shù)組圖像格式下才成立
save_file = r"E:\pic\123\test.jpg"
# cv2.imshow('666', image)
cv2.imencode('.jpg', frame1)[1].tofile(save_file) # 防止出現(xiàn)亂碼
blackwhite(save_file, 1) # 處理需要識(shí)別的并覆蓋原圖像
num = chanese2num(save_file)
return num
# cv2.waitKey(0)
if __name__ == '__main__':
num = main()
print(f"編號(hào)是{num}的圖片是相似度最高的")
"""
在爬蟲(chóng)程序里這樣調(diào)用:
my_crawler是你存放這個(gè)代碼的文件夾
from my_crawler import yanzhengma2
if __name__ == '__main__':
num = yanzhengma2.main()
print(num)
#num就是你需要的編號(hào)
"""
我用來(lái)識(shí)別過(guò)文字,但效果很差勁,對(duì)于文字間隔,像素質(zhì)量要求很?chē)?yán)格。
整體來(lái)說(shuō)效果不好
import pytesseract
import numpy as np
from PIL import Image
def threshold_By_OTSU(input_img_file):
newimage = Image.open(input_img_file).convert('L') # 打開(kāi)圖片時(shí)候用convert('L')方法轉(zhuǎn)換為灰點(diǎn)
newimage.save(r"E:\pic\123/9.jpg")
print(pytesseract.image_to_string(newimage, lang='chi_sim'))
file=r'E:\pic\123\8.jpg'
threshold_By_OTSU(file)
這里使用時(shí),遇到了opencv中讀取圖片,和PIL中Image讀取圖片的不同方式,之后再仔細(xì)研究一下使用規(guī)范
帶帶弟弟是一個(gè)非常強(qiáng)大的驗(yàn)證碼識(shí)別工具,可以識(shí)別漢字,滑塊,點(diǎn)擊文字等許多種類(lèi)的驗(yàn)證碼
github源碼:https://github.com/sml2h3/ddddocr
pypi官方:https://pypi.org/project/ddddocr/
對(duì)于文字識(shí)別,代碼如下:
import os
import ddddocr
from PIL import Image
from io import BytesIO
ALLOW_FILE_TYPE = ['jpg', 'png']
ocr = ddddocr.DdddOcr(show_ad = False)
def ocr_detect(path):
"""
OCR漢字識(shí)別
"""
fp, code = None, None
if not os.path.exists(path): return code
_, file_type = path.rsplit(".",1)
if file_type.lower() not in ALLOW_FILE_TYPE: return code
try:
fp = open(path, 'rb')
con1 = fp.read()
img = Image.open(BytesIO(con1))
code = ocr.classification(img)
except Exception as exc:
print('[ERROR] 識(shí)別發(fā)生錯(cuò)誤:', exc)
finally:
if fp: fp.close()
return code
if __name__ == '__main__':
code = ocr_detect(r'E:\pic\123\test.jpg')
for i in range(8):
code2 = ocr_detect(f'E:\pic/123/{i}.jpg')
if code == code2:
print(f"編碼為{i}的是對(duì)的")
else:
print("寄了")
具體使用方式參考官方文檔即可
更多方法用到后會(huì)繼續(xù)更新~
當(dāng)前名稱(chēng):關(guān)于多種驗(yàn)證碼的應(yīng)對(duì)方式
文章網(wǎng)址:http://chinadenli.net/article8/dsogdip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、做網(wǎng)站、ChatGPT、移動(dòng)網(wǎng)站建設(shè)、小程序開(kāi)發(fā)、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)