使用Tesseract OCR识别简单的验证码
在爬虫模拟登陆时,会遇到验证码这个障碍,如果网站使用的是很简单的验证码,可以使用OCR(Optical Character Recording,光学字符识别)从图像中抽取文本。
1.环境搭建
1.下载Tesseract
https://github.com/tesseract-ocr/tesseract
2.安装Python支持的OCR库
pip install pytesseract
pip install pillow
pytesseract是Tesseract的识别库;pillow是pytesseract的依赖库(PIL的分支版本)
3.关联tesseract-OCR
打开pytesseract.py源文件,一般目录在./lib/site-packages/pytesseract
,找到如下代码
tesseract_cmd = 'tesseract'
将其指向到Tesseract OCR的tesseract.exe,我这里是
tesseract_cmd = r'D:\tesseract-OCR\tesseract.exe'
2.OCR识别图片
1.简单图片
对于只有文本的图片来说,直接使用tesseract的图像字符串转化函数。如:
from PIL import Image
import pytesseract
img = Image.open("1234.png")
print(pytesseract.image_to_string(img))
输出如下:
可以看到成功抽取。
2.较复杂的验证码图片
含有较少的背景噪点或干扰文本的图片,如下图
使用上文代码抽取文本时,返回空字符串,说明抽取文本失败,这是因为图像中的背景对文本产生了干扰,此时需要去除背景的干扰,只保留文本部分。从上图看出,背景颜色比文本颜色明亮许多,只有验证码文本是黑色的,所以可以通过检测像素是否为黑色将文本分离出来,这里通过pillow实现该过程。
from PIL import Image
import pytesseract
img = Image.open("1234.png")
gray = img.convert("L")#转换图像模式,L表示灰色图像,可以设置0~255之间的值,0表示黑,255表示白
gray.save('gray.png')
text = gray.point(lambda x:0 if x<1 else 255,"1")#将阈值小于1的像素都设为0.其余设为255
text.save("text.png")
print(pytesseract.image_to_string(text))#就可以正确提取验证码了
使用OCR抽取简单的数字很容易,但是对于更加复杂的验证码图片,比如文本倾斜或者噪点很多的验证码,OCR的识别准确率很低,此时可以选择第三方平台或者使用其他方法绕过验证码