Python爬虫技术系列-05字符验证码识别
创始人
2024-01-16 11:55:39
0

Python爬虫技术系列-05字符验证码识别

  • 1. 光学文字识别
    • 1.1 OCR概述
    • 1.2 OCR识别库Tesseract下载安装
    • 1.3 生成验证码图片
    • 1.4 字符验证码识别
      • 1.安装python识别验证码库:
      • 2.验证码识别:
    • 1.5 使用打码平台识别验证码
    • 1.6 滑动验证码识别

1. 光学文字识别

1.1 OCR概述

OCR(Optical Character Recognition,光学字符识别)是指使用扫描仪或数码相机对文本资料进行扫描成图像文件,然后对图像文件进行分析处理,自动识别获取文字信息及版面信息的软件。一般情况下,对于字符型验证码的识别流程如下:主要过程可以分解为五个步骤:图片清理字符切分字符识别,恢复版面后处理文字几个步骤。通过本章节学习联系搭建OCR环境,使用Tesseract平台对验证码进行识别。

在这里插入图片描述
在进行图片识别前,需要对验证码图片进行处理,包括灰度化二值化。像素点是最小的图片单元,一张图片由很多像素点构成,一个像素点的颜色是由RGB三个值来表现的,所以一个像素点对应三个颜色向量矩阵,我们对图像的处理就是对这个像素点的操作。
图片的灰度化,就是让像素点矩阵中的每一个像素点满足 R=G=B,此时这个值叫做灰度值,白色为255,黑色为0。灰度转化一般公式为:R=G=B=处理前的。灰度转化一般公式为:R=G=B=处理前的,R0.3+G0.59+B*0.11。
图像的二值化,就是将图像的像素点矩阵中的每个像素点的灰度值设置为0(黑色)或255(白色),从而实现二值化,将整个图像呈现出明显的只有黑和白的视觉效果。原理是利用设定的一个阈值来判断图像像素是0还是255,一般小于阈值的像素点变为0,大于的变成255。这个临界灰度值就被称为阈值,阈值的设置很重要,阈值过大或过小都会对图片造成损坏。选择阈值的原则是:既要尽可能保存图片信息,又要尽可能减少背景和噪声的干扰。常用阈值选择的方法是:灰度平局值法:取127(0~255的中数,(0+255)/2=127);平均值法:计算像素点矩阵中的所有像素点的灰度值的平均值avg;迭代法:选择一个近似阈值作为估计值的初始值,然后进行分割图像,根据产生的子图像的特征来选取新的阈值,在利用新的阈值分割图像,经过多次循环,使得错误分割的图像像素点降到最小。

二值化处理
在这里插入图片描述
旋转处理
在这里插入图片描述

1.2 OCR识别库Tesseract下载安装

  1. Tesseract下载安装:

    1. 下载地址:https://digi.bib.uni-mannheim.de/tesseract/
    1. 双击安装 tesseract-ocr-setup-3.05.00dev.exe 或最新版本
      在这里插入图片描述
    1. 配置环境变量
      TESSDATA_PREFIX C:/Program Files (x86)/Tesseract-OCR
      tesseract C:\Program Files (x86)\Tesseract-OCR
      path C:\Program Files (x86)\Tesseract-OCR
      在这里插入图片描述
    1. 测试 cmd中输入tesseract –v
      在这里插入图片描述
    1. OCR识别 tesseract test.jpg result
      在这里插入图片描述

1.3 生成验证码图片

安装验证码库:

pip install captcha==0.4

生成验证码

from captcha.image import ImageCaptchaimg = ImageCaptcha()
image = img.generate_image('ABCD')
image.show()
image.save('captcha1.jpg')

输出为:
在这里插入图片描述

1.4 字符验证码识别

1.安装python识别验证码库:

pip install pytesseract==0.3.10
pip install opencv-python==3.4.18.65

2.验证码识别:

构建一个验证码:
在这里插入图片描述
读者可以截图,然后另存为 3N3D.jpg

识别代码为:

import cv2 as cv
import pytesseract
from PIL import Image
def recognize_text(image):# 定义函数dst = cv.pyrMeanShiftFiltering(image, sp=10, sr=150) # 边缘保留滤波  去噪gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY) # 灰度图像ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU) # 二值化erode = cv.erode(binary, None, iterations=2) # 形态学操作   腐蚀  膨胀dilate = cv.dilate(erode, None, iterations=1)cv.imshow('dilate', dilate)cv.bitwise_not(dilate, dilate) # 逻辑运算,背景设为白色,字体为黑,便于识别cv.imshow('binary-image', dilate)test_message = Image.fromarray(dilate) # 识别text = pytesseract.image_to_string(test_message)print(f'识别结果:{text}')src = cv.imread('3N3D.jpg')
cv.imshow('input image', src)
recognize_text(src)
cv.waitKey(0)
cv.destroyAllWindows()

输出为:
在这里插入图片描述

1.5 使用打码平台识别验证码

任务分析:

在很多网站都会使用验证码来进行反爬,所以为了能够更好的获取数据,需要了解如何使用打码平台爬虫中的验证码。
常见的打码平台:
http://www.ttshitu.com/

提供验证码图片7364.jpg
在这里插入图片描述读者可以截图,然后另存为 7364.jpg

打码平台识别验证码

import json
import requests
import base64
from io import BytesIO
from PIL import Image
from sys import version_infodef base64_api(uname, pwd, img):  # 打码平台解析工具img = img.convert('RGB')buffered = BytesIO()img.save(buffered, format="JPEG")# result = Noneif version_info.major >= 3:b64 = str(base64.b64encode(buffered.getvalue()), encoding='utf-8')else:b64 = str(base64.b64encode(buffered.getvalue()))data = {"username": uname, "password": pwd, "image": b64}result = json.loads(requests.post("http://api.ttshitu.com/base64", json=data).text)if result['success']:return result["data"]["result"]else:return result["message"]
if __name__ == "__main__":img_path = "./7364.png"# img_path = "./captcha1.jpg"img = Image.open(img_path)# 这里用自己的用户名和密码result = base64_api(uname='XXXX', pwd='XXX', img=img)print("真正解析出来的值是:", result)

输出为:
在这里插入图片描述

1.6 滑动验证码识别

任务分析:

滑动验证码滑动拼图验证码在普通的滑块验证码上增加了随机的滑动距离,用户需要根据拼图缺口位置来决定滑块的滑动长度。解决它的方法也很直观,首先找到缺口的位置(通常只需要X轴的位置),然后拖动滑块即可。用python识别出滑块验证中的缺口位置。
在这里插入图片描述

解题思路:
在这里插入图片描述

下载chrome浏览器驱动
http://chromedriver.storage.googleapis.com/index.html
选择对应的驱动
放在工程目录下
代码如下:
参考:selenium处理各类滑块验证码

# -*- coding: utf-8 -*-
import timefrom PIL import Image, ImageChops
from selenium import webdriver
from selenium.webdriver import ChromeOptions, ActionChains# 添加参数
options = ChromeOptions()
# options.add_argument('--headless')
# options.add_argument('--no-sanbox')# 创建WebDriver对象
browser = webdriver.Chrome(options=options)
browser.get('http://www.porters.vip/captcha/jigsawCanvas.html')
browser.maximize_window()
time.sleep(2)# 定位滑块
slide_btn = browser.find_element_by_id('jigsawCircle')
# 定位背景图
pre_img = browser.find_element_by_id('imagebox')
# 截取背景图
pre_img.screenshot('before.png')
# 事件对象
actionChains = ActionChains(browser)
# 点击滑块
actionChains.click_and_hold(slide_btn).perform()
time.sleep(1)
# 使用js隐藏方块
script = """var missblock = document.getElementById('missblock');missblock.style['visibility'] = 'hidden';
"""
browser.execute_script(script)
time.sleep(1)
# 再次截图
pre_img.screenshot('after.png')# 使用PIL创建Image
before_img = Image.open('before.png').convert('RGB')
after_img = Image.open('after.png').convert('RGB')
# 使用ImageChops对比差异
different_place = ImageChops.difference(before_img, after_img)
diff_position = different_place.getbbox()# 使用js显示方块
script = """var missblock = document.getElementById('missblock');missblock.style['visibility'] = '';
"""
browser.execute_script(script)
time.sleep(1)# 观察网站滑块移动的长度和位置
actionChains.drag_and_drop_by_offset(slide_btn, diff_position[0] - 10, 0).perform()
time.sleep(2)# 关闭
browser.close()

使用ImageChops.difference对比差异是发现getbbox()返回的是None,这里需要在打开图片是采用RGB的方式:Image.open(‘after.png’).convert(‘RGB’)

相关内容

热门资讯

成长的痕迹 -作文 成长的痕迹 -作文小时候,当我们咬下一小口好酸好酸的橘子,总是会狠狠的闭上眼睛,嘴角却是上弧,成长的...
作文 约定 作文 约定还记得吗?那一天,我嘴馋,受不住桌底零食的诱惑,偷偷和你在课堂里吃起来,你一口,我一口,嘴...
苹果作文400字 苹果作文400字(精选50篇)  在日常学习、工作或生活中,大家都接触过作文吧,借助作文人们可以实现...
新疆之旅-喀纳斯湖1000字... 新疆之旅-喀纳斯湖1000字作文新疆之旅——喀纳斯湖1000字作文旅行的第三天早上,我们游览的是新疆...
《温暖》作文500字 关于《温暖》作文500字四篇  在日常生活或是工作学习中,许多人都有过写作文的经历,对作文都不陌生吧...
会笑的眼睛作文850字 会笑的眼睛作文850字  进入新的班级,每个人的内心或许都曾是无助的,孤寂的,陌生的。然而,她给我帮...
致老师的一封信 致老师的一封信(精选31篇)  在生活、工作和学习中,大家都写过信,肯定对各类书信都很熟悉吧,书信可...
那一刻我流泪了作文600字 那一刻我流泪了作文600字(精选38篇)  在日常学习、工作或生活中,大家都经常接触到作文吧,作文是...
广玉兰的作文 关于广玉兰的作文(精选51篇)  在现实生活或工作学习中,大家对作文都再熟悉不过了吧,作文是由文字组...
谢谢你帮助了我作文200字 谢谢你帮助了我作文200字(通用28篇)  在平凡的学习、工作、生活中,大家总免不了要接触或使用作文...
莫让“浮云”遮望眼作文600... 莫让“浮云”遮望眼作文600字  在我们平凡的日常里,大家都尝试过写作文吧,借助作文可以提高我们的语...
那一次我尝到了幸福的滋味作文 那一次我尝到了幸福的滋味作文(精选9篇)  在生活、工作和学习中,大家最不陌生的就是作文了吧,根据写...
打针作文400字 打针作文400字九篇  在日常学习、工作或生活中,许多人都有过写作文的经历,对作文都不陌生吧,借助作...
哦,原来是这样作文550字 哦,原来是这样作文550字  下了几天雨,星期天太阳公公终于露出了灿烂的笑脸,我和妈妈享受着那久违的...
养猪猪的感受作文 养猪猪的感受作文啊哈!!~~~我开始养猪猪啦!!!我好happy啊!!嘿嘿!!!这天,我不清不楚的去...
我的学习态度作文 我的学习态度作文4篇  在生活、工作和学习中,大家都写过作文,肯定对各类作文都很熟悉吧,作文是经过人...
家有喜事优秀作文 家有喜事优秀作文(精选30篇)  在平平淡淡的日常中,大家对作文都不陌生吧,作文根据体裁的不同可以分...
中考作文素材 中考作文素材精选15篇  无论是身处学校还是步入社会,大家都跟作文打过交道吧,作文是通过文字来表达一...
我是一只蚂蚁作文 我是一只蚂蚁作文450字(通用35篇)  在日常学习、工作抑或是生活中,大家最不陌生的就是作文了吧,...
我的祖父作文600字 我的祖父作文600字  在日常生活或是工作学习中,大家总少不了接触作文吧,根据写作命题的特点,作文可...