5 驗證碼機器識別

2021-08-07 13:33:38 字數 3600 閱讀 3270

因為我們不能每次都要手動輸入驗證碼,所以要想辦法讓電腦來做這件事

因為學校的這個驗證碼太水了,識別非常容易,所以我直接用pytesser這個包就可以達到可以接受的識別率了

為了不影響主函式,先新建乙個pytesser.py,我們在這裡面先測試一下這個庫可不可以正常用

(pytesser庫的安裝我記得很麻煩,我安的時候忘了截圖了。pytesser要依賴

tesseract-ocr的庫,然後這個庫又依賴leptonica這個庫。

可以參考這一篇:mac 安裝pytesser)

裝好了就可以導入庫來使用了

結果對不對不重要,有結果就行。

好了既然可以使用了我們建立一下capcha.py來實現一下識別驗證碼的函式:

步驟就是先把轉換成乙個黑白的相位圖(這一步其實可以省略,因為這個本身就是黑白的==),然後用pytesser來識別

def capcha():

img = image.open('code.png')

img_grey = img.convert('l')

#img_grey.show()

threshold = 140

table =

for i in range(256):

if i < threshold:

else:

img_out = img_grey.point(table, '1')

text = image_to_string(img_grey) # 將轉成字串

return text

接下來回到qiangke.py的檔案中,將上一步中手動輸入的code換成由電腦識別後的code,記得import capcha.

測試後發現驗證碼識別總是不對,列印後發現原來是識別後的文字莫名加了換行,用strip去掉就行了。

code = capcha.capcha().strip('\n')

這裡如果不相信電腦,可以做乙個判斷,來看看需不需要手動輸入驗證碼:

if input_text == 'y':

code = code.strip('\n')

#print 'code:',code

else:

code = raw_input('沒時間解釋了,快輸入正確的驗證碼》')

測試了幾次發現電腦的識別還算可以,加上迴圈完全可以比人更快的識別出驗證碼。

小結:識別驗證碼完全可以用機器學習來處理,如果有時間我會將這部分再優化一下,提高識別的速度

最終原始碼:

#-*-coding:utf-8 -*-

import urllib2

import urllib

import cookielib

from bs4 import beautifulsoup

from pil import image

import capcha

#登陸頁

url_login = ''

#選課頁

course_url = ''

#驗證碼頁

yanzhengmaurl = ''

#提交選課資訊的url

submit_url = 'select/'

login_info =

# 初始化乙個cookiejar來處理cookie

cookiejar=cookielib.cookiejar()

# 例項化乙個全域性opener

# 訪問課程主頁 這個時候每一次訪問都自動帶著cookie資訊了

result = opener.open(course_url).read()

# 顯示一下結果

#print result

#獲取驗證碼,並將驗證碼儲存在當前資料夾

codeimg = opener.open(yanzhengmaurl).read()

# result = opener.open(yanzhengmaurl)

with open('code.png','wb') as fn:

fn.write(codeimg)

img = image.open('code.png').strip('\n')

img.show()

code = capcha.capcha()

submit_data =

submit_data=urllib.urlencode(submit_data)

req2 = urllib2.request(submit_url,submit_data)

html = opener.open(req2).read()

#print html

# 抓一下返回結果

array =

soup = beautifulsoup(html)

a = soup.find_all("div", class_=['alert', 'alert-block', 'alert-error', 'fade in'])

for i in a:

str1 = str(array[0])

str2 = str1.splitlines()

str3 = str2[3].strip()

print str3

#return str3

capcha.py

# encoding=utf-8

from pil import image

from pytesser import *

def capcha():

img = image.open('code.png')

img_grey = img.convert('l')

#img_grey.show()

threshold = 140

table =

for i in range(256):

if i < threshold:

else:

img_out = img_grey.point(table, '1')

text = image_to_string(img_grey) # 將轉成字串

return text

驗證碼 簡單驗證碼識別

這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 興之所至之所以說簡單,我覺得是這樣的 抽了五張驗證碼扔進ps,50 透明度,長這樣 只有數字為內容 每張圖的數字都在固定位置 沒有太大的干擾因素 數字字型,形態完...

驗證碼識別

驗證碼識別過程好比人大腦的乙個識別過程 首先,我們的眼睛接收,並將這張的資訊輸送給大腦 然後,我們的大腦接收到這個資訊以後,對這個資訊作出處理 最後,將中的有效資訊提取出來再將其和大腦中儲存的資訊進行對應對比,確定對比結果。模擬驗證碼識別,大腦接受的處理過程就相當於電腦對的預處理,大腦對進行對比和確...

驗證碼識別

import tensorflow as tf 定義乙個初始化權重的函式 def weight variables shape w tf.variable tf.random normal shape shape,mean 0.0,stddev 1.0 return w 定義乙個初始化偏置的函式 d...