点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

荷笠带斜阳,青山独归远。

作者简介:张老师,学习计算机十余年,在信息安全、生物信息学、会计、平面设计、编辑出版等多个领域均有涉猎,热爱钻研、热爱考证、热爱生活。

大家好,我是志斌~

志斌之前一直在写反爬虫系列的文章,但是因为自身水平有限,所以一直没更验证码反爬虫之文字点选验证码反爬虫的解决方式,这次专门为大家找了一个大佬——张老师,来跟大家分享一下他解决文字点选验证码的方法~

基本思路

  1. 获取图像

  2. 对图像进行二值化处理

  3. 识别图中轮廓

  4. 识别轮廓文字

  5. 构建待选文字图像

  6. 比较识别文字与待选文字图像

  7. 返回点选结果

本文仅提供基本思路,具体应用需根据各类型点选验证码自行修改。

实现过程

0.导入依赖

import base64
import json
import cv2
import numpy as np
import requests
from PIL import Image, ImageDraw, ImageFont
  1. 获取图像

第一步是获取图像,有一些验证码图像是以二进制形式返回的,本文测试的图像是以base64编码字符串的形式返回,因此需要对其进行解码。

def getData(capsession: requests.Session):resp = s.post("验证码获取url")return resp.json()["repData"]def getImageFromBase64(b64):buffer = base64.b64decode(b64)nparr = np.frombuffer(buffer, np.uint8)image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)return image

2.对图像进行二值化处理

为了方便识别文字轮廓,我们对图像进行二值化处理。

def normalizeImage(img):img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, img = cv2.threshold(img, 1, 255, cv2.THRESH_BINARY)img = cv2.bitwise_not(img)return img

3.识别图中轮廓

在识别图中轮廓时,为了提高效率和准确度,我们对轮廓按长宽比和面积进行筛选,尽可能保证轮廓能够满足文字识别需要。

def findContour(img):contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)def find_if_close(cnt1, cnt2):row1, row2 = cnt1.shape[0], cnt2.shape[0]for i in range(row1):for j in range(row2):dist = np.linalg.norm(cnt1[i] - cnt2[j])if abs(dist) < 5:return Trueelif i == row1 - 1 and j == row2 - 1:return FalseLENGTH = len(contours)status = np.zeros((LENGTH, 1))for i, cnt1 in enumerate(contours):x = iif i != LENGTH - 1:for j, cnt2 in enumerate(contours[i + 1:]):x = x + 1dist = find_if_close(cnt1, cnt2)if dist == True:val = min(status[i], status[x])status[x] = status[i] = valelse:if status[x] == status[i]:status[x] = i + 1unified = []maximum = int(status.max()) + 1for i in range(maximum):pos = np.where(status == i)[0]if pos.size != 0:cont = np.vstack([contours[i] for i in pos])hull = cv2.convexHull(cont)unified.append(hull)cnt = list(filter(aspectRatio,unified))cnt.sort(key=cv2.contourArea,reverse=True)return cnt[:4]def aspectRatio(cnt):_,_,w,h = cv2.boundingRect(cnt)return (0.6<float(w)/h<1.7) and (cv2.contourArea(cnt)>200.0)

4.识别轮廓文字

我们对图中文字轮廓进行识别,返回文字轮廓与相应的坐标位置。

def extractCharContour(img, contour):mult = 1.2ret = []point = []for cnt in contour:rect = cv2.minAreaRect(cnt)box = cv2.boxPoints(rect)box = np.int0(box)W = rect[1][0]H = rect[1][1]Xs = [i[0] for i in box]Ys = [i[1] for i in box]x1 = min(Xs)x2 = max(Xs)y1 = min(Ys)y2 = max(Ys)rotated = Falseangle = rect[2]if angle < -45:angle += 90rotated = Truecenter = (int((x1 + x2) / 2), int((y1 + y2) / 2))size = (int(mult * (x2 - x1)), int(mult * (y2 - y1)))try:M = cv2.getRotationMatrix2D((size[0] / 2, size[1] / 2), angle,1.0)cropped = cv2.getRectSubPix(img, size, center)cropped = cv2.warpAffine(cropped, M, size)croppedW = W if not rotated else HcroppedH = H if not rotated else WcroppedRotated = cv2.getRectSubPix(cropped,(int(croppedW * mult), int(croppedH * mult)),(size[0] / 2, size[1] / 2),)im = cv2.resize(croppedRotated, (20, 20))kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]],np.float32)im = cv2.filter2D(im, -1, kernel=kernel)ret.append(im)point.append((rect[0][0], rect[0][1]))except:passreturn ret, point

5.构建待选文字图像

将获取的待选文字转化为图像。

def genCharacter(ch, size):img = Image.new("L", size, 0)font = ImageFont.truetype("simsun.ttc", min(size))draw = ImageDraw.Draw(img)draw.text((0, 0), ch, font=font, fill=255)return np.asarray(img)

6.比较识别文字与待选文字图像

我们将识别文字轮廓与待选文字图像进行比较,获得对应位置,并根据验证码要求依次添加点选坐标。

def compareCharImage(words, chars, point, word_list) scores = []for i, word in enumerate(words):for j, char in enumerate(chars):scores.append(((i, j), cv2.bitwise_xor(char, word).sum()))scores.sort(key=lambda x: x[1])word_set = set()char_set = set()answers = {}for score in scores:if (score [0][0] not in word_set) and (score [0][1] not in char_set):continueword_set.add(score[0][0])char_set.add(score[0][1])answers[word_list[score[0][0]]] = point[score[0][1]]return [{"x": int(answers[word][0]),"y": int(answers[word][1])} for word in word_list]

7.返回点选结果

最后,将得到的点选结果返回给服务器进行验证。

def checkCaptcha(captchaSession: requests.Session, data, point):enc = encrypt(json.dumps(point).replace(" ", ""), data["secretKey"])resp = captchaSession.post("验证码提交url",json={"token": data["token"],"pointJson": enc,},)return resp.json()

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

------------------- End -------------------

往期精彩文章推荐:

  • Python中encode和encoding的区别是什么?

  • 手把手教你使用openpyxl库从Excel文件中提取指定的数据并生成新的文件(附源码)

  • 手把手教你用Python来模拟绘制自由落体运动过程中的抛物线(附源码)

  • 盘点3种Python网络爬虫过程中的中文乱码的处理方法

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

文字点选验证码的破解方法~相关推荐

  1. 文字点选验证码再也不是难题,通过率 96% 的深度学习了解一下!

    " 阅读本文大概需要 3 分钟. " 验证码是计算机领域发明的一大障碍,它已经成为爬虫工程师最大的拦路虎,是爬虫工程师必须要面对的一道屏障. 面对上面这种无干扰且较规整的字符型验证 ...

  2. 文字点选识别验证码识别

    文字点选识别&验证码识别 Warning!请保证本项目仅用于研究学习!感谢配合支持! 项目地址: https://github.com/youfengyouyang/Spider_Captch ...

  3. 【易盾图像识别】文字点选识别 附带 模型+数据集 +识别代码+思路

    如有损害他人利益,请即时通知,文章会在第一时间内删除! 前言 继极验文字点选的发布,怎么能少得了易盾呢,本次分享将会把模型,代码,数据集一起分享出来! 摘要(About this paper): 易盾 ...

  4. 本地通用验证码识别DLL/通用滑块识别/文字点选/图标点选/OCR文字识别/本地识别DLL

    背景 验证码识别一直都是一个重要的话题,近日有一些公司询问 本地DLL验证码识别定制的事,可以联系QQ:[167231471]定制本地离线DLL验证码识别.另外给大家普及一下通用验证码识别和滑块缺口检 ...

  5. 本地DLL通用验证码识别/滑块识别/文字点选/图标点选/推理/OCR文字识别

    背景 验证码识别一直都是一个重要的话题,近日有一些公司询问 本地DLL验证码识别定制的事,可以联系QQ:[167231471]定制本地离线DLL验证码识别.另外给大家普及一下通用验证码识别和滑块缺口检 ...

  6. 本地腾讯滑块识别DLL/本地通用验证码识别DLL/文字点选/图标点选/本地识别DLL

    背景 验证码识别一直都是一个重要的话题,近日有一些公司询问 本地DLL验证码识别定制的事,可以联系QQ:[167231471]定制本地离线DLL验证码识别.另外给大家普及一下通用验证码识别和滑块缺口检 ...

  7. 本地滑块识别DLL/本地通用验证码识别DLL/文字点选/图标点选/本地识别DLL

    背景 验证码识别一直都是一个重要的话题,近日有一些公司询问 本地DLL验证码识别定制的事,可以联系QQ:[167231471]定制本地离线DLL验证码识别.另外给大家普及一下通用验证码识别和滑块缺口检 ...

  8. 本地OCR文字识别DLL/本地通用验证码识别DLL/通用滑块识别/文字点选/图标点选/本地识别DLL

    背景 验证码识别一直都是一个重要的话题,近日有一些公司询问 本地DLL验证码识别定制的事,可以联系QQ:[167231471]定制本地离线DLL验证码识别.另外给大家普及一下通用验证码识别和滑块缺口检 ...

  9. html 勾选框点击文字勾选,ztree点击文字勾选checkbox,radio实现方法

    ztree的复选框checkbok,单选框radio是用背景图片来模拟的,所以点击文字即使用label括起checkbox,radio文字一起,点击文字也是无法勾选checkbox. 要想点击ztre ...

最新文章

  1. Docker客户端常用命令整理
  2. it行业php,什么是IT行业
  3. 服务器选型:怎样的一款服务器产品才算是优秀的
  4. 报名 | 东南大学周张泉:基于知识图谱的推理技术
  5. u盘安装linux 提示no such device_Linux 网络基础设计
  6. Java多线程时内存模型
  7. 什么是条件组合覆盖_什么是综合评价?高中生报名有哪些好处?
  8. .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证
  9. pc端签名 vue 生成图片_Vue Canvas 实现电子签名 手写板
  10. HTML学习总结(2)——标题/水平线/注释/段落/折行/文本格式化
  11. 谷歌浏览器Choromium定制
  12. MATLAB插值函数_akala啦_新浪博客
  13. 中国5G基站将带动155GWh以上锂电池需求
  14. 影响力最大化 RIS 反向影响力采样算法
  15. SVG霍比特人电影标题样式
  16. 蓝桥杯B组 杨辉三角
  17. 网页打开慢,甚至突然打不开?图片刷新不出来?多半是DNS的问题!
  18. 云计算基础(二)—— 虚拟化
  19. IIS Rewrite 下载与配置
  20. 计算机c语言专业就业方向,计算机专业就业方向

热门文章

  1. 投资中的N种认知偏差总有一款败你
  2. 计算2的N次方//C语言
  3. 第一次用idea写SSM框架的项目就遇到自动注入失败的问题
  4. 祝大家2022幸福安康
  5. LDP中的UE(一元编码)和LATENT中方法UER实现
  6. 三子棋(时间智障版)
  7. 介绍大家一个很好玩的网站。多人在线flash联机游戏。
  8. xtend怎么使用_Java替代Xtend又推出了另一个块摇摆更新
  9. 技术管理那些事(二)“人剑合一”的团队
  10. cocos2dx3.16输入框:TextField和EditBox的使用