Python验证码的实操讲解

简介: Python验证码的实操讲解

大致介绍
  在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类:

    1、计算验证码

   2、滑块验证码

    3、识图验证码

    4、语音验证码

  这篇博客主要写的就是识图验证码,识别的是简单的验证码,要想让识别率更高,识别的更加准确就需要花很多的精力去训练自己的字体库。

  识别验证码通常是这几个步骤:

    1、灰度处理

    2、二值化

    3、去除边框(如果有的话)

    4、降噪

    5、切割字符或者倾斜度矫正

    6、训练字体库

    7、识别

  这6个步骤中前三个步骤是基本的,4或者5可根据实际情况选择是否需要,并不一定切割验证码,识别率就会上升很多有时候还会下降

  这篇博客不涉及训练字体库的内容,请自行搜索。同样也不讲解基础的语法。

  用到的几个主要的python库: Pillow(python图像处理库)、OpenCV(高级图像处理库)、pytesseract(识别库)

  

灰度处理&二值化
  灰度处理,就是把彩色的验证码图片转为灰色的图片。

  二值化,是将图片处理为只有黑白两色的图片,利于后面的图像处理和识别

  在OpenCV中有现成的方法可以进行灰度处理和二值化,处理后的效果:

  

  代码:

复制代码
1 # 自适应阀值二值化
2 def _get_dynamic_binary_image(filedir, img_name):
3 filename = './out_img/' + img_name.split('.')[0] + '-binary.jpg'
4 img_name = filedir + '/' + img_name
5 print('.....' + img_name)
6 im = cv2.imread(img_name)
7 im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #灰值化
8 # 二值化
9 th1 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)
10 cv2.imwrite(filename,th1)
11 return th1

//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDE5MTAyNA==.html
复制代码

去除边框
  如果验证码有边框,那我们就需要去除边框,去除边框就是遍历像素点,找到四个边框上的所有点,把他们都改为白色,我这里边框是两个像素宽

  注意:在用OpenCV时,图片的矩阵点是反的,就是长和宽是颠倒的

  代码:

复制代码

去除边框

def clear_border(img,img_name):
filename = './out_img/' + img_name.split('.')[0] + '-clearBorder.jpg'
h, w = img.shape[:2]
for y in range(0, w):
for x in range(0, h):
if y < 2 or y > w - 2:
img[x, y] = 255
if x < 2 or x > h -2:
img[x, y] = 255

cv2.imwrite(filename,img)
return img
复制代码   

  效果:

降噪
  降噪是验证码处理中比较重要的一个步骤,我这里使用了点降噪和线降噪

  

  线降噪的思路就是检测这个点相邻的四个点(图中标出的绿色点),判断这四个点中是白点的个数,如果有两个以上的白色像素点,那么就认为这个点是白色的,从而去除整个干扰线,但是这种方法是有限度的,如果干扰线特别粗就没有办法去除,只能去除细的干扰线

  代码:

复制代码
1 # 干扰线降噪
2 def interference_line(img, img_name):
3 filename = './out_img/' + img_name.split('.')[0] + '-interferenceline.jpg'
4 h, w = img.shape[:2]
5 # !!!opencv矩阵点是反的
6 # img[1,2] 1:图片的高度,2:图片的宽度
7 for y in range(1, w - 1):
8 for x in range(1, h - 1):
9 count = 0
10 if img[x, y - 1] > 245:
11 count = count + 1
12 if img[x, y + 1] > 245:
13 count = count + 1
14 if img[x - 1, y] > 245:
15 count = count + 1
16 if img[x + 1, y] > 245:
17 count = count + 1
18 if count > 2:
19 img[x, y] = 255
20 cv2.imwrite(filename,img)
21 return img
复制代码

  点降噪的思路和线降噪的差不多,只是会针对不同的位置检测的点不一样,注释写的很清楚了

  代码:

复制代码

点降噪

def interference_point(img,img_name, x = 0, y = 0):
"""
9邻域框,以当前点为中心的田字框,黑点个数
:param x:
:param y:
:return:
"""
filename = './out_img/' + img_name.split('.')[0] + '-interferencePoint.jpg'

# todo 判断图片的长宽度下限
cur_pixel = img[x,y]# 当前像素点的值
height,width = img.shape[:2]

//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDE4NjQwMA==.html

for y in range(0, width - 1):
  for x in range(0, height - 1):
    if y == 0:  # 第一行
        if x == 0:  # 左上顶点,4邻域
            # 中心点旁边3个点
            sum = int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y + 1])
            if sum <= 2 * 245:
              img[x, y] = 0
        elif x == height - 1:  # 右上顶点
            sum = int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x - 1, y]) \
                  + int(img[x - 1, y + 1])
            if sum <= 2 * 245:
              img[x, y] = 0
        else:  # 最上非顶点,6邻域
            sum = int(img[x - 1, y]) \
                  + int(img[x - 1, y + 1]) \
                  + int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y + 1])
            if sum <= 3 * 245:
              img[x, y] = 0
    elif y == width - 1:  # 最下面一行
        if x == 0:  # 左下顶点
            # 中心点旁边3个点
            sum = int(cur_pixel) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y - 1]) \
                  + int(img[x, y - 1])
            if sum <= 2 * 245:
              img[x, y] = 0
        elif x == height - 1:  # 右下顶点
            sum = int(cur_pixel) \
                  + int(img[x, y - 1]) \
                  + int(img[x - 1, y]) \
                  + int(img[x - 1, y - 1])

            if sum <= 2 * 245:
              img[x, y] = 0
        else:  # 最下非顶点,6邻域
            sum = int(cur_pixel) \
                  + int(img[x - 1, y]) \
                  + int(img[x + 1, y]) \
                  + int(img[x, y - 1]) \
                  + int(img[x - 1, y - 1]) \
                  + int(img[x + 1, y - 1])
            if sum <= 3 * 245:
              img[x, y] = 0
    else:  # y不在边界
        if x == 0:  # 左边非顶点
            sum = int(img[x, y - 1]) \
                  + int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x + 1, y - 1]) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y + 1])

            if sum <= 3 * 245:
              img[x, y] = 0
        elif x == height - 1:  # 右边非顶点
            sum = int(img[x, y - 1]) \
                  + int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x - 1, y - 1]) \
                  + int(img[x - 1, y]) \
                  + int(img[x - 1, y + 1])

            if sum <= 3 * 245:
              img[x, y] = 0
        else:  # 具备9领域条件的
            sum = int(img[x - 1, y - 1]) \
                  + int(img[x - 1, y]) \
                  + int(img[x - 1, y + 1]) \
                  + int(img[x, y - 1]) \
                  + int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x + 1, y - 1]) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y + 1])
            if sum <= 4 * 245:
              img[x, y] = 0
cv2.imwrite(filename,img)
return img

复制代码

相关文章
|
6月前
|
数据采集 机器学习/深度学习 安全
Python爬虫之极验滑动验证码的识别
了解极验滑动验证码、特点、识别思路、初始化、模拟点击、识别缺口、模拟拖动。
378 0
|
3月前
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
52 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
27天前
|
数据采集 自然语言处理 API
Python反爬案例——验证码的识别
Python反爬案例——验证码的识别
|
1月前
|
数据处理 iOS开发 MacOS
Python 虚拟环境安装使用(Anaconda 实操完整版)
【10月更文挑战第4天】Anaconda 是一个开源的 Python 发行版,集成了常用科学计算与数据处理库,并提供了方便的包管理工具 `conda`。虚拟环境则允许在同一台机器上创建多个独立的 Python 运行环境,避免库版本冲突。通过下载 Anaconda、创建与激活虚拟环境、安装软件包及管理环境,可有效支持 Python 项目开发。
|
1月前
|
数据采集 自然语言处理 Python
用 Python 生成并识别图片验证码
用 Python 生成并识别图片验证码
25 1
|
28天前
|
数据采集 消息中间件 API
Python爬虫验证码识别——手机验证码的自动化处理
Python爬虫验证码识别——手机验证码的自动化处理
|
1月前
|
文字识别 开发者 iOS开发
Python反爬机制-验证码(一)
Python反爬机制-验证码(一)
|
1月前
|
人工智能 文字识别 API
Python反爬机制-验证码(二)
Python反爬机制-验证码(二)
|
2月前
|
消息中间件 安全 数据库
动手实操!Python IPC机制,打造高效协同的进程军团
【9月更文挑战第10天】在软件开发领域,进程间的高效协作对应用性能与稳定性至关重要。Python提供了多种进程间通信(IPC)机制,如管道、消息队列、套接字、共享内存等,帮助开发者构建高效协同的系统。本文将通过动手实践,使用`multiprocessing`模块演示如何利用队列实现进程间通信。示例代码展示了如何创建一个工作进程从队列接收并处理数据,从而实现安全高效的进程交互。通过实际操作,读者可以深入了解Python IPC的强大功能,提升系统的并发处理能力。
54 0
|
3月前
|
消息中间件 安全 数据库
动手实操!Python IPC机制,打造高效协同的进程军团
【8月更文挑战第2天】在 software development 领域, Python 的进程间通信 (IPC) 能力对应用性能与稳定性至关重要。Python 提供了多样化的 IPC 机制, 如管道、消息队列、套接字、共享内存等, 每种都有独特优势。本文以动手实践为主, 使用 `multiprocessing` 模块演示 IPC 的实现。示例代码展示了如何利用 `Queue` 在进程间安全高效地传输数据。
42 0