当前位置: 首页 > news >正文

【验证码的识别】—— 点触式验证码的识别

一、前言

大家好,不知不觉的我来csdn已经又一周年了,在这一年里,我收获了很多东西,我是2022年2月22日入驻CSDN的,一开始只是为了方便浏览文章的,后来,我也有事没事发发文章,创作了100多篇文章,有近三分之一是高质量文章,在这个不到一年里,我收获了1066位粉丝,其实,我写文章不是为了粉丝数量,只是在这个平台把自己的知识分享给别人。在新的一年里,我可以继续努力,日出万物生,日落满天星。新的一年依然记得仰望星空。2022年6月16日,那时候我才2个粉丝。虽然现在的粉丝不多,2000都没有。但是,这些都是次要的,主要是我在这里学到了很多东西。

今天借这个机会表达一下,我在csdn一周年的纪念。为了回馈粉丝长久以来的支持,博主决定开始给大家送福利了。在爬虫时,网上的免费代理IP不好用,怎么办?不要慌,我给大家争取到了一个福利,点击下面链接即可免费领取七天测试
        http://suo.nz/2zmKBG
        白嫖不要不要的

二、引文

目前,许多网站采取各种各样的措施来反爬虫,其中一个措施便是使用验证码。随着技术的发展,验证码的花样越来越多。验证码最初是几个数字组合的简单的图形验证码,后来加入了英文字母和混淆曲线。有的网站还可能看到中文字符的验证码,这使得识别愈发困难。

后来 12306 验证码的出现使得行为验证码开始发展起来,用过 12306 的用户肯定多少为它的验证码头疼过。我们需要识别文字,点击与文字描述相符的图片,验证码完全正确,验证才能通过。现在这种交互式验证码越来越多,如极验滑动验证码需要滑动拼合滑块才可以完成验证,点触验证码需要完全点击正确结果才可以完成验证,另外还有滑动宫格验证码、计算题验证码等。

验证码变得越来越复杂,爬虫的工作也变得愈发艰难。有时候我们必须通过验证码的验证才可以访问页面。本章就专门针对验证码的识别做统一讲解。

接下来会涉及的验证码有普通图形验证码、极验滑动验证码、点触验证码、微博宫格验证码,这些验证码识别的方式和思路各有不同。了解这几个验证码的识别方式之后,我们可以举一反三,用类似的方法识别其他类型验证码。

三、点触验证码识别

除了极验验证码,还有另一种常见且应用广泛的验证码,即点触验证码。

可能你对这个名字比较陌生,但是肯定见过类似的验证码,比如 12306 就是典型的点触验证码,直接点击图中符合要求的图。所有答案均正确,验证才会成功。如果有一个答案错误,验证就会失败。这种验证码就称为点触验证码。

3.1. 本节目标

我们的目标是用程序来识别并通过点触验证码的验证。

3.2. 准备工作

我们使用的 Python 库是 Selenium,使用的浏览器为 Chrome。请确保已经正确安装好 Selenium 库、Chrome 浏览器,并配置好 ChromeDriver,相关流程可以参考我其他的博文。

3.3. 了解点触验证码

与 12306 站点相似,不过这次是点击图片中的文字而非图片。点触验证码有很多种,它们的交互形式略有不同,但其基本原理都是类似的。

3.4. 识别思路

第一步:如果依靠图像识别点触验证码,则识别难度非常大。例如,某网站的识别难点有两点,第一点是文字识别,第二步:图像的识别。将图像重新转化文字,可以借助各种识图接口,但识别的准确率非常低,经常会出现匹配不正确或无法匹配的情况。而且图片清晰度不够,识别难度也会更大。

3.5. 解决办法

此类验证码该如何识别?互联网上有很多验证码服务平台,平台 7×24 小时提供验证码识别服务,一张图片几秒就会获得识别结果,准确率可达 90% 以上 ,例如超级鹰平台:

超级鹰平台提供了如下一些服务:

  • 1.英文数字:提供最多 20 位英文数字的混合识别
  • 2.中文汉字:提供最多 7 个汉字的识别
  • 3.纯英文:提供最多 12 位的英文的识别
  • 4.纯数字:提供最多 11 位的数字的识别
  • 5.任意特殊字符:提供不定长汉字英文数字、拼音首字母、计算题、成语混合、 集装箱号等字符的识别
  • 6.坐标选择识别:如复杂计算题、选择题四选一、问答题、点击相同的字、物品、动物等返回多个坐标的识别

这里我们需要处理的就是坐标多选识别的情况。我们先将验证码图片提交给平台,平台会返回识别结果在图片中的坐标位置,然后我们再解析坐标模拟点击即可

3.6. 获取 API

在官方网站下载对应的 Python API,链接为:https://www.chaojiying.com/api-14.html。此 API 是 Python 2 版本的,是用 requests 库来实现的。我们可以简单更改几个地方,即可将其修改为 Python 3 版本。

修改之后的 API 如下所示:

import requests
from hashlib import md5class Chaojiying(object):def __init__(self, username, password, soft_id):self.username = usernameself.password = md5(password.encode('utf-8')).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def post_pic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def report_error(self, im_id):"""im_id: 报错题目的图片 ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()

这里定义了一个 Chaojiying 类,其构造函数接收三个参数,分别是超级鹰的用户名、密码以及软件 ID,保存以备使用。

最重要的一个方法叫作 post_pic(),它需要传入图片对象和验证码类型的代号。该方法会将图片对象和相关信息发给超级鹰的后台进行识别,然后将识别成功的 JSON 返回。

另一个方法叫作 report_error(),它是发生错误的时候的回调。如果验证码识别错误,调用此方法会返回相应的题分。

3.7.模拟登陆

利用selenium模拟以账号登陆方式模拟登陆某网站。

from chaojiying import Chaojiying
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
from io import BytesIO
# from urllib import request
from PIL import Image
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s-%(levelname)s-%(message)s')
logger = logging.getLogger('spider')class Jianshu():def __init__(self,cjy_username,cjy_password,cjy_softid,cjy_kind):self.url = 'https://www.jianshu.com/sign_in'# self.browser = webdriver.Chrome()self.browser = webdriver.PhantomJS()self.wait = WebDriverWait(self.browser,20)self.cjy_kind = cjy_kindself.chaojiying = Chaojiying(cjy_username,cjy_password,cjy_softid)def __del__(self):self.browser.close()def open(self,js_username,js_password):"""打开网页输入用户名密码:return: None"""self.browser.maximize_window()self.browser.get(self.url)self.browser.implicitly_wait(10)self.browser.find_element_by_link_text('登录').click()login_name = self.wait.until(EC.presence_of_element_located((By.XPATH,"//input[@type='text' and @id='session_email_or_mobile_number']")))login_name.send_keys(js_username)login_password = self.browser.find_element_by_xpath('//input[@type="password" and @id="session_password"]')login_password.send_keys(js_password)def get_button(self):button = self.browser.find_element_by_class_name('sign-in-button')return buttondef get_element(self,name='captch.png'):element = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.geetest_widget')))self.element = elementlocation = element.locationsize = element.size#获取验证码左上角位置,以及验证码的宽和高(取它的位置和宽高,随后返回其左上角和右下角的坐标)left_y, right_y, left_x, right_x = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width']# print(left_x,right_x,left_y,right_y)#获取屏幕截图,以二进制形式存入内存中scrsnap = self.browser.get_screenshot_as_png()scrsnap = Image.open(BytesIO(scrsnap))#裁剪图片crop方法传入参数依次为(图片左上角x,图片左上角y,图片右下角x,图片右下角y)captcha = scrsnap.crop((left_x,left_y,right_x,right_y))captcha.save(name)return captchadef get_point(self,result):# result = {'err_no': 0, 'err_str': 'OK', 'pic_id': '3108110014436000003', 'pic_str': '47,127|56,124', 'md5': '6e5164aa4f99e6f25dfd95fd12e30e1c'}#pic_str依次为需要识别的文字的坐标,是以字符串形式返回的,每个坐标都以|分隔pic_strs = result.get('pic_str').split('|') #['47,127', '56,124']# locations = [[int(number) for number in group.split(',')] for group in pic_str]locations = []for pic_str in pic_strs:location = [int(number) for number in pic_str.split(',')]# print(locations) [[47, 127], [56, 124]]locations.append(location)return(locations,len(locations))def click_action(self,locations):for location in locations:print(location)#调用动作链move_to_element_with_offset(o_element,xoffset,yoffset)方法,移动到某个元素的某个坐标上ActionChains(self.browser).move_to_element_with_offset(self.element,location[0],location[1]).click().perform()time.sleep(1)try:self.browser.find_element_by_class_name('geetest_commit').click()except Exception as error:print(error)def run_task(self,js_username,js_password):self.open(js_username,js_password)button =  self.get_button()button.click()image = self.get_element()#创建操作二进制的内存流byte_flow = BytesIO()  #<class '_io.BytesIO'>#将image对象以png格式存入byte_flow文件流中image.save(byte_flow,format='PNG')result = {'err_no': 0, 'err_str': 'OK', 'pic_id': '3108110014436000003', 'pic_str': '116,173|47,127|56,124','md5': '6e5164aa4f99e6f25dfd95fd12e30e1c'}# result = self.chaojiying.post_pic(byte_flow.getvalue(),self.cjy_kind)locations,length = self.get_point(result)self.click_action(locations)login_status = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#q")))if login_status:logger.info("登录成功")else:logger.error("登录失败")if __name__ == '__main__':#超级鹰用户名、密码、软件 ID、验证码类型cjy_username = ''cjy_password = ''cjy_softid = ''cjy_kind = js_username = ''js_password = ''Jianshu(cjy_username,cjy_password,cjy_softid,cjy_kind).run_task(js_username,js_password)

相关文章:

【验证码的识别】—— 点触式验证码的识别

一、前言 大家好&#xff0c;不知不觉的我来csdn已经又一周年了&#xff0c;在这一年里&#xff0c;我收获了很多东西&#xff0c;我是2022年2月22日入驻CSDN的&#xff0c;一开始只是为了方便浏览文章的&#xff0c;后来&#xff0c;我也有事没事发发文章&#xff0c;创作了1…...

深入浅出C++ ——priority_queue类深度剖析

文章目录一、priority_queue类简介二、priority_queue类常用接口三、priority_queue类的使用四、STL中priority_queue类的模拟实现一、priority_queue类简介 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。…...

117.Android 简单的拖拽列表+防止越界拖动(BaseRecyclerViewAdapterHelper)

//1.第一步 导入依赖库和权限&#xff1a; //依赖库&#xff1a; //RecyclerView implementation com.android.support:recyclerview-v7:28.0.0//RecyclerAdapter implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28 //用到的权限&#xff1a; <!…...

什么是Struts2?有哪些优势

Java中Strutsl是最早的基于MVC模式的轻量级Web框架&#xff0c;它能够合理地划分代码结构&#xff0c;并包含验证框架、国际化框架等多种实用工具框架。但是随着技术的进步&#xff0c;Struts1的局限性也越来越多地暴露出来。为了符合更加灵活、高效的开发需求&#xff0c;Stru…...

Ubuntu22.04 安装Mongodb6.X

Ubuntu22.04 安装Mongodb6.X 1、Mongodb简介 1.1 什么是MongoDB? Mongodb是一个跨平台的面向文档的NoSQL数据库。它使用带有可选模式的类似JSON的BSON来存储数据。应用程序可以以JSON格式检索信息。 1.2 MongoDB的优点 可以快速开发web型应用&#xff0c;因为灵活&#xff0c;…...

启动内核,能启动内核但是无法进入内核,始终卡在某一地方,比如 No soundcards found.

项目场景&#xff1a; 配置好uboot后&#xff0c;启动内核&#xff0c;能启动内核但是无法进入内核&#xff0c;始终卡在某一地方&#xff0c;比如下图 ALSA device list:No soundcards found.问题描述 原因分析&#xff1a; 这是无法进入根文件系统而出现的错误&#xff0c…...

SQL零基础入门学习(六)

SQL零基础入门学习&#xff08;六&#xff09; SQL零基础入门学习&#xff08;五&#xff09; SQL 通配符 通配符可用于替代字符串中的任何其他字符。 SQL 通配符用于搜索表中的数据。 在 SQL 中&#xff0c;可使用以下通配符&#xff1a; 演示数据库 在本教程中&#xff…...

股票、指数、快照、逐笔... 不同行情数据源的实时关联分析应用

在进行数据分析时经常需要对多个不同的数据源进行关联操作&#xff0c;因此在各类数据库的 SQL 语言中均包含了丰富的 join 语句&#xff0c;以支持批计算中的多种关联操作。 DolphinDB 不仅通过 join 语法支持了对于全量历史数据的关联处理&#xff0c;而且在要求低延时的实时…...

华为OD机试真题Python实现【 不含 101 的数】真题+解题思路+代码(20222023)

不含 101 的数 题目 小明在学习二进制时,发现了一类不含 101 的数, 也就是将数字用二进制表示,不能出现 101 。 现在给定一个正整数区间 [l,r],请问这个区间内包含了多少个不含 101 的数? 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇…...

centos7 搭建ELK(elasticsearch、logstash、kibana)

1、下载安装包 使用华为镜像站下载速度很快&#xff0c;华为镜像站&#xff1a;https://mirrors.huaweicloud.com/home&#xff0c;下载时需要保证版本一致 2、安装elasticsearch 解压到当前目录 [rootlocalhost elk]# tar zxvf elasticsearch-7.4.2-linux-x86_64.tar.gz 安…...

如何写新闻稿?写好新闻稿的技巧与步骤

新闻稿是传递新闻事件和信息的重要手段&#xff0c;是传媒工作中不可或缺的一部分。写好一篇新闻稿可以让受众了解更多信息&#xff0c;进一步提高他们的关注度。以下是一些写好新闻稿的技巧和步骤&#xff0c;帮助你有效地传达新闻。1、确定新闻的核心信息在开始写新闻稿之前&…...

抖音不想只做“开心果”

出品 | 何玺 排版 | 叶媛 2023一开年&#xff0c;抖音就新动作不断。先是宣布启动线上超市&#xff0c;继而又传出将在3月份试水外卖业务&#xff0c;展现出多面出击的姿态。 01 抖音杀入线上超市、外卖赛道 抖音正式杀入“线上超市”赛道。据多家媒体报道&#xff0c;抖音…...

MATLAB | 如何用MATLAB绘制这样有气泡感的网络图

今天给大家带来一款用来绘制有气泡感的网络图的工具函数&#xff0c;绘制效果如下&#xff1a; 花里胡哨的&#xff0c;气泡大小代表流入流出数据量综合&#xff0c;不同颜色的气泡代表属于不同类&#xff0c;两个气泡之间有连线代表有数据流动&#xff0c;连线透明度代表流动数…...

Linux 远程登录

Linux 一般作为服务器使用&#xff0c;而服务器一般放在机房&#xff0c;你不可能在机房操作你的 Linux 服务器。 这时我们就需要远程登录到Linux服务器来管理维护系统。 Linux 系统中是通过 ssh 服务实现的远程登录功能&#xff0c;默认 ssh 服务端口号为 22。 Window 系统…...

SAP中BOM基础数量及组件数量单位比例关系的注意事项

下图是BOM展开功能CS11在正式系统和测试系统的截图。从截图中的对比不难看出&#xff0c;最下级的原材料A20981-110在组件的数量为1&#xff0c;实际按BOM中的设定比例折算&#xff0c;应该是1个成品&#xff0c;对应需要0.125件原材料。但这里显示的并不是0.125PC&#xff0c;…...

华为OD机试真题Python实现【最大相连男生数】真题+解题思路+代码(20222023)

最大相连男生数 题目 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。 这个相连位置在一个直线上,方向可以是水平的、垂直的、成对角线的或者反对角线的。 注:学生个数不会超过 10000。 🔥🔥🔥🔥🔥👉👉👉👉👉�…...

Vue使用ElementUI对表单元素进行自定义校验

前言 在使用ElementUI的表单元素时候&#xff0c;除了做一些简单的非空处理校验&#xff0c;在一些特殊的场合&#xff0c;还需要我们做一些自定义校验。 其实ElementUI不仅提供了基本的非空校验&#xff0c;也对我们提供了自定义检验。 在使用的时候还是遇到了一些坑&#…...

linux的文件权限介绍

文件权限 在linux终端输入 ls -lh 出现下面界面 介绍 基本信息 其中的开头代表着文件类型和权限 而 root 和kali 则分别代表用户名和用户组名用户名顾名思义就是这个文件属于哪一个用户用户组是说自己在写好一个文件后&#xff0c;这个文件是属于该用户所有&#xff0c;…...

支付系统中的设计模式03:模板方法模式

在上一节末尾,留了一个需求问题,就是老板提出的「支付前锁定账户,支付后增加积分」这个需求「3」没有解决。有些文章写得比较好的人其实会有一些固定的结构格式,比如总分总、总分、分总、并列、对照、递进等等。这种固定的结构格式,就是文章的模板。把它挪到编程中,也是一…...

【黏住用户的不是小红书,而是它背后的那些人】

最近在研究CDC线下城市联盟的事情&#xff0c;周六与本地组织做了一场简单的活动&#xff0c;没想到现场开发者热情暴涨&#xff0c;现场沟通了很多&#xff0c;大家普遍有两层需求&#xff1a; 1.加入圈子沟通 2.互助学习提升 CDC&#xff0c;也就是线下圈子&#xff0c;如…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...