对于用户来说,当然希望自己的爬虫能够爬取到自己想要的资源,但是对于服务来说,有时候却并不希望自己服务器上的资源那么轻易的被爬虫获取到。因此就出现了反爬虫,图形验证码就是这样一种机制。
各种验证码可以说是判断操作者是人还是机器的一个重要手段,而光学文字识别(Optical Character Recognition,OCR)可以或多或少解决这个问题。
Tesseract
Tesseract 是一个 OCR 库,通过训练该库可以识别任何字体。
安装
该项目的 github 地址为:https://github.com/tesseract-ocr/tesseract
设置环境变量
安装完成之后,为了在全局都能够使用 tesseract,需要设置环境变量,与平常不同,该软件除了需要将 tesseract 所在的目录添加到环境变量中,还需要另外设置一个名为 TESSDATA_PREFIX 的环境变量,该环境变量的值为 .traineddata 训练数据集的所在目录。
在 cmd 中使用 tesseract
环境变量设置完成之后,就可以在终端中使用 tesseract 进行操作了,使用方法为:
tesseract imgpath txtpath
上边的命名会启动 tesseract,识别 imgpath 指向的图片,并将识别后的结果保存到 txtpath 中,一般情况下可以不用指定 txtpath 的文件名,系统会自动添加文件扩展名。
pytesseract
基本使用
import pytesseract
from PIL import Image
# tesseract 路径
pytesseract.pytesseract.tesseract_cmd = r'D:\Tesseract\Tesseract-OCR\tesseract.exe'
image = Image.open('000.jpg')
# 将识别的图片转换为 string
text = pytesseract.image_to_string(image)
print(text)
识别图形验证码
使用 tesseract 识别网站图形验证码的逻辑也很简单:
- 使用 urllib 或 requests 发送请求
- 将 response 中的图形验证码解析出来,并保存到本地
- 在本地利用 pytesseract 库识别图形验证码
但是由于 tesseract 并不能够保证百分百识别正确,因此也不能保证 pytesseract 识别的结果是正确的。
同时在本地识别出的图形验证码,就算识别正确,由于时效等原因,也不能将识别结果输入到对应的文本框中,因此在爬虫应用中感觉也用的不多。
通常遇到图形验证码的情况,还是会选择利用 selenium+chromedriver 模拟浏览器行为,通过键盘输入以保证结果的准确性。