识别验证码的一般步骤为: 获取网络图片-> 写入文件到硬盘->使用PIL读取硬盘里的文件->PIL对文件进行预处理->进行文本识别。
这里“获取网络图片->写入文件到硬盘->使用PIL读取硬盘里的文件”实际是出于无奈,因为PIL的Image.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模块)。
from PIL import Image
import urllib
import cStringIO
url = 'http://202.119.81.113:8080/verifycode.servlet' # 验证码URL
r = urllib.urlopen(url)
imgBuf = cStringIO.cStringIO(r.read()) # 采用StringIO直接将验证码文件写到内存,省去写入硬盘
img = Image.open(imgBuf) # PIL库加载图片
摘抄自:https://www.polarxiong.com/archives/python-pil-stringio.html