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

news2025/11/2 15:53:10

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 ImageCaptcha

img = 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_info

def base64_api(uname, pwd, img):  # 打码平台解析工具
    img = img.convert('RGB')
    buffered = BytesIO()
    img.save(buffered, format="JPEG")
    # result = None
    if 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 time

from 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’)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卡尔曼滤波实例——预测橘子的轨迹

目录 流程 一、采用轮廓的方式检测橘子位置 (一)滚动条获取阈值 (二)获取到图像中的包围橘子对应的白色图形的最小矩形框的信息 二、获取橘子检测框的质心 三、将质心送入卡尔曼滤波器,获取下一次的质心位置 四…

Markdown语言的简单学习

Markdown简单语法标题#空格 一级标题##空格 二级标题 以此类推三级标题四级...五级.....引用列表代码块表格分隔线链接强调语法(斜体、加粗、下划线)标题 #空格 一级标题 ##空格 二级标题 以此类推 三级标题 四级… 五级… … 引用 这是一段引用 …

<人生重开模拟器>——《Python项目实战》

目录 1.模拟实现 "人生重开模拟器" 1.1 问题导引: 1.2 问题分析: 2. 模拟实现分析及步骤: 3.完整源码: 4.写在最后的话: 后记:●由于作者水平有限,文章难免存在谬误之处&…

数据结构与算法----栈和队列(Stack Queue)

文章目录栈栈的操作栈的初始化入栈出栈取栈顶的元素判断栈是否为空求栈中数据元素的个数遍历栈中的所有元素清空栈栈的存储结构顺序存储链式存储顺序栈和链栈的区别栈的实战题目队列队列的操作入队出队遍历队列清空队列队列的存储结构顺序存储循环队列链式存储队列实战题目总结…

快速发布windows上的web项目【免费内网穿透】

快速发布windows上的web项目【免费内网穿透】 文章目录快速发布windows上的web项目【免费内网穿透】什么是cpolar内网穿透?概述1. 搭建一个静态Web站点1.1 下载演示站点1.2 本地运行演示站点1.3 本地浏览测试站点是否正常2. 注册并安装cpolar内网穿透3. 本地web站点…

玩转 CSS 的艺术之美

你将获得 深刻理解各种CSS原理 解构不为人知的CSS技巧 概念、技巧、场景三合一,实现“神奇”效果 强化吸收CSS知识体系,玩转各种神操作骚技巧 作者介绍 JowayYoung,资深前端工程师,目前就职于网易互动娱乐事业群&#xff0c…

前端面试之道

小册介绍 如果需要用一句话来介绍这本小册的话,「一年磨一剑」应该是最好的答案了。 为什么这样说呢?在出小册之前,我收集了大量的一线大厂面试题,通过大数据统计出了近百个常考知识点,然后根据这些知识点写成了这本…

《深度学习》:CANN训练营_昇腾AI入门课学习笔记(第二章 TensorFlow模型迁移训练)

文章目录第二章 TensorFlow模型迁移&训练本章学习目标AI模型开发基础知识入门Python水平要求了解深度学习和神经网络了解TensorFlow AI框架了解基于CANN的模型开发流程(重点)TensorFlow AI模型迁移详解为什么要做模型迁移TensorFlow AI模型自动迁移详…

【Python数据科学快速入门系列 | 10】Matplotlib数据分布图表应用总结

这是机器未来的第59篇文章 原文首发地址:https://robotsfutures.blog.csdn.net/article/details/127484292 《Python数据科学快速入门系列》快速导航: 【Python数据科学快速入门系列 | 01】Numpy初窥——基础概念【Python数据科学快速入门系列 | 02】创…

安卓讲课笔记3.3 相对布局

文章目录零、学习目标一、导入新课二、新课讲解(一)相对布局概述1、布局特点2、继承关系图3、常用属性(1)相对于父容器居中(2)相对于父容器对齐(3)相对于其它控件位置(4&…

牛客网经典Java面试常见题

个人主页:熬夜磕代码丶 作品专栏: 数据结构与算法 我变秃了,也变强了 给大家介绍一款程序员必备刷题平台——牛客网 点击注册一起刷题收获大厂offer吧 文章目录一、二叉搜索树与双向链表二、从尾到头打印链表三、调整数组奇数位于偶数前面四、删除链表…

大数据毕业设计可视化大屏前后端项目分享

1、前言 很久没有分享过可视化大屏的项目了,距离上次分享基于Echarts的数据可视化大屏系统设计分享这篇可视化系统已经过去了整整一年有余。当时分享这篇博客没想到会收获这么多的阅读量,并且在刚发布的时候,还上了CSDN的博客热搜2&#xff…

gcc环境下演示C语言变长数组

前言 👻作者:龟龟不断向前 👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。 👻专栏:C初阶知识点 👻工具分享: 刷题: 牛客网 leetcode笔记软…

安全帽佩戴识别算法

安全帽佩戴识别算法采用SuiJi-AI人工智能深度学习技术计算机智能视觉识别算法,且通过规模化的安全帽数据识别训练。安全帽佩戴识别算法借助现场已有的监控摄像头对监控画面中人员着装行为进行实时分析识别。假如检测人员不戴安全帽,SuiJiAi将立即记录和警…

致敬第一个1024(第一次Java代码编程)

昨日,笔者刚刚下载好IDEA,今日,笔者将会实现第一次的Java代码!!信心满满!!下面请看笔者的代码吧!!骄傲的小心,已经澎湃! 因此,本篇文…

如何实现一个SQL解析器

作者:vivo 互联网搜索团队- Deng Jie 一、背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架。而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进行数据查询。SQL作为一个学习成本很低的语言&#…

【正点原子I.MX6U-MINI应用篇】5、嵌入式Linux在LCD上显示BMP、JPG、PNG图片

一、BMP图像介绍与显示 我们常用的图片格式有很多,一般最常用的有三种:JPEG(或 JPG)、PNG、BMP和GIF。其中 JPEG(或JPG)、PNG以及 BMP 都是静态图片,而 GIF 则可以实现动态图片。 BMP(全称 Bitmap)是Window操作系统中的标准图像文件格式&am…

计算机学院第五次ACM周赛题解

目录 HF的智能小车车 Do you like Van game&#xff1f; 好姐姐的三角形 帮帮小陈 卷点 签个到就下班 现在是摸鱼时间 现在是摸鱼时间 PLUS HF的智能小车车 签到题目&#xff0c; #include<iostream>using namespace std;int main() {string arr;cin>>ar…

学生会信息管理系统

1、项目介绍 学生会信息管理系统拥有两种角色&#xff1a;学生和管理员 学生&#xff1a;查看活动和新闻信息、发布活动、登录注册 管理员&#xff1a;公共新闻管理、用户管理、活动审核等 2、项目技术 后端框架&#xff1a; Servlet、mvc模式 前端技术&#xff1a;jsp、c…

Linux(centos)安装Jenkins

Jenkins 是一个开源的, 基于Java的自动服务器&#xff0c;提供了一种建立持续集成和持续交付(CI/CD)流水线的简单方法 。 持续集成 (CI)是DevOps实践中&#xff0c;团队成员定期将他们的代码更改提交到版本仓库, 然后运行自动化的构建和测试. 持续交付(CD)是自动构建、测试和部…