对于用户来说,当然希望自己的爬虫能够爬取到自己想要的资源,但是对于服务来说,有时候却并不希望自己服务器上的资源那么轻易的被爬虫获取到。因此就出现了反爬虫,图形验证码就是这样一种机制。

各种验证码可以说是判断操作者是人还是机器的一个重要手段,而光学文字识别(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 模拟浏览器行为,通过键盘输入以保证结果的准确性。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐