这是在我学习用Python识别验证码时发现的提高效率的方法。

识别验证码的一般步骤为:获取网络图片->写入文件到硬盘->使用PIL读取硬盘里的文件->PIL对文件进行预处理->进行文本识别

这里“获取网络图片->写入文件到硬盘->使用PIL读取硬盘里的文件”实际是出于无奈,因为PILImage.open()函数只接受文件名,不接受图片文件本身。而Image.fromstring()只接受像素格式的字符串,也不接受图片文件。

所以只能采用将图片文件写入到硬盘,然后使用Image.open()读取,有需要再采用Image.load()读取为像素格式。
即:

from PIL import Image

import urllib
url = 'http://202.119.81.113:8080/verifycode.servlet'  # 验证码URL
r = urllib.urlopen(url)
f = open('VCode.jpg', 'wb')    #这里是将验证码图片写入到本地文件
f.write(r.read())
f.close()
img = Image.open('VCode.jpg')  # PIL库加载图片

实际上可以利用StringIO库(Python:StringIO模块),将网络图片写入到内存(实际网络图片这是也已经在内存),然后“伪装”成普通文件传给Image.open()

from PIL import Image

import urllib
import StringIO
url = 'http://202.119.81.113:8080/verifycode.servlet'  # 验证码URL
r = urllib.urlopen(url)
imgBuf = StringIO.StringIO(r.read())  # 采用StringIO直接将验证码文件写到内存,省去写入硬盘
img = Image.open(imgBuf)  # PIL库加载图片

这样就避免了硬盘写和硬盘读,如果对读写内存文件有更高要求,可以考虑cStringIO(Python:cStringIO模块)。