因為我們不能每次都要手動輸入驗證碼,所以要想辦法讓電腦來做這件事
因為學校的這個驗證碼太水了,識別非常容易,所以我直接用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...