前言
這兩天在看相關于模擬登錄的案例壹哺,不可避免的遇到了一些驗證碼相關的問題畴嘶,在此之前一直使用的是將驗證碼下載到本地溶其,然后人工肉眼識別的方式。但是效果可想而知策橘,精確度倒是還可以炸渡,然而卻變得不是很智能了。于是今天來學習一下如何自動識別驗證碼丽已。
環(huán)境
我的實驗環(huán)境為:
- Python3.6
- Pycharm2016.2 Professional
- Tesseract-OCR-3.0
- Windows 10 64位
在開始之前確保安裝了tesseract引擎蚌堵,然后是pytesseract這個第三方庫。
如果沒有安裝其實也是可以使用的沛婴,那就是借助Python調用系統(tǒng)命令的方式來實現(xiàn)將驗證碼圖片中的內容讀入到文本文件吼畏,在通過代碼讀取文本文件得到驗證碼內容。 但是pytesseract使得這樣的一個過程更加簡便嘁灯,所以沒有安裝的話還是建議安裝一下泻蚊。
pip install pytesseract
讀取圖片的時候需要PIL庫的支持,沒有安裝的話還是建議先安裝一下丑婿,否則程序無法進行下去的性雄。
實施
簡易示例
import pytesseract
from PIL import Image
image = Image.open(r'checkcode.gif', mode='r')
vcode = pytesseract.image_to_string(image)
print(vcode)
結果為:
之所以不在PyCharm中運行, 就是因為會出現(xiàn)一些讓人不明所以的錯誤信息羹奉。比如什么
- FileNotFoundError
- Permission Denyed
- .TesseractError: (1, 'Error opening data file \Software\tesseract\Tesseract-OCR\tessdata/eng.traineddata')
我也查了相關的資料秒旋,發(fā)現(xiàn)確實沒有什么好點的解決辦法,或許可以通過修改pytesseract.py
的源碼來解決吧诀拭, 誰知道呢迁筛?
實戰(zhàn)校園圖書館登錄
# coding: utf8
# @Author: 郭 璞
# @File: DLUTLibraryLogin.py
# @Time: 2017/4/7
# @Contact: 1064319632@qq.com
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 大連理工大學圖書館模擬登陸,添加了驗證碼識別腳本
import requests
import BeautifulSoup
import os, sys
import pytesseract
from PIL import Image
loginurl = 'http://opac.lib.dlut.edu.cn/reader/redr_verify.php'
captchaurl = 'http://opac.lib.dlut.edu.cn/reader/captcha.php'
headers = {
'Referer': 'http://opac.lib.dlut.edu.cn/reader/login.php',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36",
}
session = requests.Session()
##### 獲取到驗證碼并保存
checkcodecontent = session.get(captchaurl, headers=headers)
with open('checkcode.jpg', 'wb') as f:
f.write(checkcodecontent.content)
f.close()
print('驗證碼已寫入到本地!', '下面開始調用tesseract-OCR引擎識別驗證碼炫加!')
img = Image.open('checkcode.gif', mode='r')
result = pytesseract.image_to_string(image=img)
checkcode = result
print('驗證碼為:', checkcode)
# os.startfile('checkcode.jpg')
# checkcode = input('請輸入驗證碼:')
##### 準備登陸圖書館系統(tǒng)
payload = {
'number':'學號',
'passwd':'密碼',
'captcha': checkcode,
'select':'cert_no'
}
response = session.post(loginurl, headers=headers, data=payload)
print('服務器端返回碼: ', response.status_code)
soup = BeautifulSoup(response.text, 'html.parser')
## 打印當前用戶
username = soup.find('font', {'color': 'blue'})
print(username.get_text())
## 打印積分信息
jifen = soup.find_all('span', {'class': 'bigger-170'})[3]
jifen = str(jifen.get_text())
print('當前登錄用戶總積分:', jifen)
效果演示
恩瑰煎,用戶名那點確實出現(xiàn)了亂碼,但是從積分那塊我們也可以發(fā)現(xiàn)確實是登錄成功了俗孝。相比于第一個版本酒甸,使用了pytesseract來處理驗證碼問題,還真的是比較方便的赋铝,最起碼不用再手動輸入了插勤,這也算是一個進步吧。
最后,需要說明的是在Pycharm中不好用农尖,還非得到CMD中去運行析恋,真的是很無語。
總結
最后又發(fā)現(xiàn)一個問題那就是Python36對于Pillow4.1.0不能兼容盛卡,安裝上去之后會出現(xiàn)各種各樣的問題助隧,比如:ImportError: DLL load failed: from . import _imaging as core
解決辦法就是安裝Pillow4.0.0,反正我是這么解決的了滑沧。
對于驗證碼問題并村,使用tesseract基本上已經滿足需求了。但是很多時候還是不能正確的獲取到真實的驗證碼內容滓技。
而現(xiàn)在網(wǎng)上也有很多專門的服務哩牍,通過接口的形式在線處理驗證碼問題,精準度還是很不錯的令漂,有興趣的話可以嘗試一下膝昆。