失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【爬虫】学习:OCR识别图形验证码

【爬虫】学习:OCR识别图形验证码

时间:2020-06-28 10:03:46

相关推荐

【爬虫】学习:OCR识别图形验证码

GitHub

python3网络爬虫开发实战第二版——8.1

环境问题

安装

1.参考:Tesserocr 的安装 | 静觅

在 Windows 下,首先需要下载 Tesseract,它为 Tesserocr 提供了支持…

2.官方GitHub

从simonflueckiger/tesserocr-windows_build/releases下载与您的 Windows 平台和 Python 安装相对应的轮文件,并通过以下方式安装它们:

pip install <package_name>.whl

目前最高支持python3.7

验证一下

1

ImportError: cannot import name ‘_imaging’ from ‘PIL’ (C:\Anaconda3\lib\site

重新安装 Pillow 包

pip uninstall Pillowpip install Pillow

2

Traceback (most recent call last):File "H:/project/python/爬虫/08 验证码识别/8.1 OCR.py", line 4, in <module>print(tesserocr.image_to_text(image))File "tesserocr.pyx", line 2443, in tesserocr._tesserocr.image_to_textRuntimeError: Failed to init API, possibly an invalid tessdata path: C:\Anaconda3\/tessdata/

参考:RuntimeError: Failed to init API, possibly an invalid tessdata path: C:\User_回忆不说话的博客-CSDN博客

把 tessdata 文件夹复制到 C:\Anaconda3下即可

基础

参考:Tesserocr 的安装 | 静觅

首先利用 Image 读取了图片文件,然后调用了 tesserocr 的 image_to_text () 方法,再将将其识别结果输出。

import tesserocrfrom PIL import Imageimage = Image.open('image.png')print(tesserocr.image_to_text(image)) # 没识别出来就是输出空output:6869

还可以直接调用 file_to_text () 方法

import tesserocrprint(tesserocr.file_to_text('image.png'))

灰度化

去除干扰点

import tesserocrfrom PIL import Imageimage = Image.open('image2.png')print(tesserocr.image_to_text(image))output:3 2e i)

先查看图片的类型

from PIL import Imageimport numpy as npimage = Image.open('image2.png')print(np.array(image).shape) # (38, 112, 4) 4通道,具有透明通道的彩色图片print(image.mode) # RGBA A是透明通道

image.convert(‘L’) 把RBGA转为更简单的L,即把图片转化为灰度图像

image = Image.open('image2.png')image = image.convert('L') # L 灰度 0-255 越小越黑;1 二值化threshold = 100 # 阈值 一般大于100 小于200 太大太小都可能识别不成功array = np.array(image)array = np.where(array > threshold, 255, 0) # 灰度大于阈值设置为255(白色),小于设置为0(黑色)image = Image.fromarray(array.astype('uint8'))image.save('image2_done.png')# image.show()print(tesserocr.image_to_text(image)) #32ec

image2_done.png

识别实战

参考:python中retry的用法_70大盗-CSDN博客_python retry

retry()在这里的功能,是在其装饰的函数运行报错后重新运行该函数

stop_max_attempt_number:在停止之前尝试的最大次数,最后一次如果还是有异常则会抛出异常,停止运行,默认为5次wait_random_min:在两次调用方法停留时长,停留最短时间,默认为0,单位毫秒wait_random_max:在两次调用方法停留时长,停留最长时间,默认为1000毫秒retry_on_result:指定一个函数,如果指定的函数返回True,则重试,否则抛出异常退出retry_on_exception: 指定一个函数,如果此函数返回指定异常,则会重试,如果不是指定的异常则会退出

import timeimport reimport tesserocrfrom selenium import webdriverfrom io import BytesIOfrom PIL import Imagefrom retrying import retryfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom mon.by import Byfrom mon.exceptions import TimeoutExceptionimport numpy as npthreshold = 120 # 阈值def preprocess(image):'''处理图片:param image: 图片对象:return: 处理后的图片对象'''image = image.convert('L')array = np.array(image)array = np.where(array > threshold, 255, 0)image = Image.fromarray(array.astype('uint8'))# image.save('1.png')# image.show()return image@retry(stop_max_attempt_number=10, retry_on_result=lambda x: x is False)def login():browser.get('https://captcha7.scrape.center/')browser.find_element_by_css_selector('.username input').send_keys('admin') # 用户名browser.find_element_by_css_selector('.password input').send_keys('admin') # 密码captcha = browser.find_element_by_css_selector('#captcha') # 验证码image = Image.open(BytesIO(captcha.screenshot_as_png)) # 先截取验证码图片,然后转化为图片对象image = preprocess(image)captcha = tesserocr.image_to_text(image) # 识别验证码print('处理前:', captcha)captcha = re.sub('[^A-Za-z0-9]', '', captcha) # 去除非字母和数字的字符print('处理后:', captcha)# 这里 '.captcha input'不行 不知道为啥?browser.find_element_by_css_selector('.captcha input[type="text"]').send_keys(captcha) # 写入验证码browser.find_element_by_css_selector('.login').click() # 点击登录try:WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, '//h2[contains(text(),"登录成功")]')))# WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, '//h2[contains(., "登录成功")]')))time.sleep(5)browser.close()print('登陆成功')print('---'*10)return Trueexcept TimeoutException:print('登陆失败')print('---'*10)return Falseif __name__ == '__main__':browser = webdriver.Chrome()login()

处理前: 40b6处理后: 40b6登陆失败------------------------------处理前: “4 4F处理后: 44F登陆失败------------------------------处理前: 3 5b Oo处理后: 35bOo登陆失败------------------------------处理前: 47406处理后: 47406登陆失败------------------------------处理前: OF Ob处理后: OFOb登陆失败------------------------------处理前: “3dad处理后: 3dad登陆失败------------------------------处理前: 2% 67处理后: 267登陆失败------------------------------处理前: 42ad处理后: 42ad登陆失败------------------------------处理前: © BASE处理后: BASE登陆失败------------------------------处理前: 8947处理后: 8947登陆成功------------------------------进程已结束,退出代码为 0

如果觉得《【爬虫】学习:OCR识别图形验证码》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。