0x00:用Python进行验证码识别
近日接触到了简单web验证码识别的问题,安装了
1、PIL
2、tesseract-ocr
3、pytesseract模块
具体安装步骤见:python验证码识别
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'
然后查找到了*上的解决方法: 原来是PIL的一个bug,先找到出错文件位置:我的是在“D:\P\Python\lib\site-packages\PIL\Image.py”,然后打开文件,大概是在1494行的位置开始,原来的代码情况可能如下图:
修改成如下图的代码:
然后就解决上面的问题了
(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