1. 程式人生 > >關於Python驗證碼識別安裝PIL、tesseract-ocr與pytesseract模組的錯誤解決

關於Python驗證碼識別安裝PIL、tesseract-ocr與pytesseract模組的錯誤解決

0x00:用Python進行驗證碼識別

近日接觸到了簡單web驗證碼識別的問題,安裝了

1、PIL
2、tesseract-ocr
3、pytesseract模組

0x01:然後是各種錯誤

(1): PIL for x64的不能正常安裝,原因是:PIL官方提供的PIL二進位制安裝庫包都是32位的。64位程式和32位程式檢測登錄檔的位置是不一樣的:64位程式檢測HKEY_LOCAL_MACHINESOFTWAREPython,而32位程式檢測HKEY_LOCAL_MACHINESOFTWAREWow6432NodePython。如果安裝的python是64位的,其相關資訊都在HKEY_LOCAL_MACHINESOFTWAREPython下面,而32位程式則在
HKEY_LOCAL_MACHINESOFTWAREWow6432NodePython下面找Python安裝資訊,結果找不到了,所以會報錯。
然後我win 10 64位的機器安裝了32位的PIL。
然後在嘗試識別驗證碼的時候報錯:

File "D:\P\Python\lib\site-packages\PIL\Image.py", line 1498, in split if self.im.bands == 1: 
AttributeError: 'NoneType' object has no attribute 'bands'

然後查詢到了stackoverflow上的解決方法: 原來是PIL的一個bug,先找到出錯檔案位置:我的是在“D:\P\Python\lib\site-packages\PIL\Image.py”,然後開啟檔案,大概是在1494行的位置開始,原來的程式碼情況可能如下圖:
原來的PIL的Image.py

修改成如下圖的程式碼:

這裡寫圖片描述
然後就解決上面的問題了
(2)
不過禍不單行,解決完上面的錯誤後又報出了下面的錯誤:

File "D:\P\Python\lib\subprocess.py", line 958, in _execute_child startupinfo)
WindowsError: [Error 2] 

尼瑪,一陣苦逼,然後查啊查,查到了原因:
Python指令碼檔案和讀取的驗證碼圖片都要儲存在“D:\P\Python\Lib\site-packages\pytesseract”(對應自己的目錄)這個目錄下
要不然就會報出上面說的錯誤。原文連結

然後將指令碼複製到D:\P\Python\Lib\site-packages\pytesseract目錄,識別了一下目錄下自帶的test.png。
成功後,又找了一張驗證碼圖片,放進D:\P\Python\Lib\site-packages\pytesseract目錄下面,修改下指令碼程式碼,識別出來了驗證碼圖片.
驗證碼

這裡寫圖片描述

原本以為雖然坎坷了那麼一點,不過問題解決了。
然後最奇特的事出現了:我將驗證碼圖片放在桌面,Python指令碼原始碼隨便放在一個目錄下,用dos命令呼叫指令碼執行,竟然可以正常識別出來!!!
一樣的原始碼,用dos命令呼叫就可以,用Pycharm執行就報錯~尼瑪…… 真會玩
然後我又把指令碼放在D:\P\Python\Lib\site-packages\pytesseract目錄下,不用dos命令執行,而用Pycharm開啟指令碼檔案執行,又報了相同的錯誤。
事情到此才告一段落。但還是不清楚為什麼一樣的指令碼用Pycharm執行不可以,用dos命令執行就可以了。搜了一下,好像已經有很多人被坑過了~~
如果有人清楚的話,麻煩留言下原因,不勝感激

0x02:附驗證碼識別原始碼

#coding:utf-8
#build by LandGrey 2016-05-17

try:
    import pytesseract
    from PIL import Image
except ImportError:
    print "Import Error !"
    raise  SystemExit

img=Image.open("vcode.jpg")
vcode= pytesseract.image_to_string(img)
print vcode