【爬虫】实验项目三:验证码处理与识别
目录
一、实验目的
二、实验预习提示
三、实验内容
实验要求
基本要求:
改进要求A:
改进要求B:
四、实验过程
基本要求
五、源码如下
六、资料
一、实验目的
部分网站可能会使用验证机制来阻止用户无效登录或者是验证用户不是用程序控制访问网站的,如 reCAPTCHA 系统。本次实验主要针对常见的验证机制:验证码进行分析和识别,这里可以使用传统和OCR技术或者基于神经网络的机器学习技术。
二、实验预习提示
1、为Python安装Selenium、PyQuery库,安装Chrome和对应ChromeDriver(见实验一)
2、为Python安装深度机器学习库和图像处理库:pytorch,python-opencv
3、为Python安装OCR库:Python第三方模块tesserocr安装 - 寒爵 - 博客园 (cnblogs.com)
注意:TESSDATA_PREFIX变量应该是包含tessdata子目录

三、实验内容
登录网站1:https://captcha7.scrape.center
登录网站2:https://captcha8.scrape.center
使用图像识别库或者训练过的神经网络模型对登录网站1的验证码进行识别,然后把识别结果用代码填入,然后再进行登录,用户名和密码都是:admin。
实验要求
基本要求:
使用一个合适的技术将登录网站1的验证码进行识别,并由代码自动登录。注意事项:所有信息必须由代码自动填入并且自动操作,无需人工填入任何信息或使用人工交互。
改进要求A:
在完成基本要求的基础上,
选项一:实现登录网站2的模拟登录,注意事项见基本要求;
选项二:实现对于带有验证登录方式(如验证码,滑动条,拼图,语序点击,空间推理,图文点击等)的常见网站。
改进要求B:
在完成基本要求的基础上,训练一个神经网络模型使得在给出测试集上准确率至少达到80%以上。框架代码:DeepLearningImageCaptcha-master.zip,测试集:dataset.zip
四、实验过程
基本要求
该实验可以从以下几个步骤执行
1. 打开游览器,打开对应网站

2. 获取用户名密码输入框并赋值

3. 获取验证码

4. 处理验证码

这里使用了ocr的升级版ddddocr , 为了提高识别验证码的精度,这里还用了正则表达式,替换掉验证码开头的符号(有时候会出现)
5. 获取验证码输入框并赋值

6. 获取登录按钮并点击登录

7. 登录成功与失败

如果登录成功就1s后关闭游览器,否则清空验证码输入框,获取心得验证码,继续登录,直到登录成功为止。
8. 控制台输出

总结:本实验前期利用 Tesserocr 识别验证码的过程并将其应用于实战案例中实现了模拟登录。为了提高 Tesserocr 的识别准确率,可以对验证码图像进行预处理去除一些干扰,识别准确率会大大提高;但最后还是转入它的升级版ddddocr。
五、源码如下
import re
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import ddddocrDDDDOCR_DDDD_OCR = ddddocr.DdddOcr()# 验证码处理
def codeDispose(v_code):ocr = DDDDOCR_DDDD_OCRres = ocr.classification(v_code.screenshot_as_png)# 验证码前面非字母数字 用空格替换res = re.sub('[^A-Za-z0-9]', '', res)return resdef login():# 打开游览器driver = webdriver.Chrome()driver.get("https://captcha7.scrape.center/")# 获取用户名密码输入框并赋值driver.find_element(By.CSS_SELECTOR, '.username input').send_keys('admin')driver.find_element(By.CSS_SELECTOR, '.password input').send_keys('admin')def code():# 获取验证码v_code = driver.find_element(By.ID, value='captcha')v_code.click() # 刷新验证码print("未处理的验证码", v_code)v_code = codeDispose(v_code) # 处理验证码print("输入验证码:", v_code)# 获取验证码输入框并赋值driver.find_element(By.CSS_SELECTOR, '.captcha input').send_keys(v_code)time.sleep(1)# 获取登录按钮并点击driver.find_element(By.CSS_SELECTOR, '.login').click()try:WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//h2[contains(.,"登录成功")]')))time.sleep(1)# 登录成功自动关闭游览器driver.close()print("登录成功")except Exception as err:print(f"登录失败:{err}")# 清空输入框driver.find_element(By.CSS_SELECTOR, '.captcha input').clear()print('成功清空输入框')code() # 再次登录code()if __name__ == '__main__':login()
六、资料
1. 实验框架代码:
import tesserocr
from PIL import Image
import numpy as np
image = Image.open('code.png')
# 方式1
result = tesserocr.image_to_text(image)
print(result) # ‘PFRT.# 方式2
print(tesserocr.file_to_text('code.png')) # ‘PFRT.
# 转为数组
print(np.array(image).shape)
print(image.mode)
code.png 如下:

2. 免费GPU训练资源:
Google Colab
3. 实验小提示
也可以使用打码平台API的调用完成验证码识别。
恭喜你成功地学完了我的所有爬虫内容!希望你已经获得了有用的信息和技巧,并且能够将其应用到实践中。如果有任何问题或疑虑,请随时与我联系。祝你好运!
相关文章:
【爬虫】实验项目三:验证码处理与识别
目录 一、实验目的 二、实验预习提示 三、实验内容 实验要求 基本要求: 改进要求A: 改进要求B: 四、实验过程 基本要求 五、源码如下 六、资料 一、实验目的 部分网站可能会使用验证机制来阻止用户无效登录或者是验证用户不是用程…...
广东成人高考报名将于9月14日开始!
截图来自广东省教育考试院官网* 今年的广东成人高考正式报名时间终于确定了! 报名时间:2023年 9 月14—20日 准考证打印时间:考前一周左右 考试时间:2023年10月21—22日 录取时间:2023年12 月中上旬 报名条件: …...
pytorch中文文档学习笔记
先贴上链接 torch - PyTorch中文文档 首先我们需要安装拥有pytorch的环境 conda指令 虚拟环境的一些指令 查看所有虚拟环境 conda info -e 创建新的虚拟环境 conda create -n env_name python3.6 删除已有环境 conda env remove -n env_name 激活某个虚拟环境 activate env…...
element-ui全局导入与按需引入
全局引入 npm i element-ui -S 安装好depencencies里面可以看到安装的element-ui版本 然后 在 main.js 中写入以下内容: import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.…...
go 地址 生成唯一索引v2 --chatGPT
问:golang 函数 getIndex(n,addr,Hlen,Tlen) 返回index。参数n为index的上限,addr为包含大小写字母数字的字符串,Hlen为截取addr头部的长度,Tlen为截取addr尾部的长度 gpt: 你可以编写一个函数来计算根据给定的参数 n、addr、Hlen 和 Tlen …...
JSON XML
JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种常用的数据交换格式,用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式,它使用易于理解的键值对的形式表示数…...
2023年MySQL实战核心技术第四篇
七 . 吃透索引:...
cmake编译(qtcreator)mingw下使用的osg3.6.5
官网下载osg3.6.5源码,先不使用依赖库,直接进行编译 如果generate后报错,显示找不到boost必须库,则手动增加路径。然后先在命令行中使用mingw32-make,如果显示不存在,则需要去环境变量里配置一下这个工具的…...
Python钢筋混凝土结构计算.pdf-混凝土强度设计值
计算原理: 需要注意的是,根据不同的规范和设计要求,上述公式可能会有所差异。因此,在进行混凝土强度设计值的计算时,请参考相应的规范和设计手册,以确保计算结果的准确性和合规性。 代码实现: …...
elasticsearch的索引库操作
索引库就类似数据库表,mapping映射就类似表的结构。我们要向es中存储数据,必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束,常见的mapping属性包括: type:字段数据类型,常见的…...
把握市场潮流,溯源一流品质:在抖in新风潮 国货品牌驶过万重山
好原料、好设计、好品质、好服务……这个2023,“国货”二字再度成为服饰行业的发展关键词。以消费热潮为翼,越来越多代表性品类、头部品牌展现出独特价值,迎风而上,在抖音电商掀起一轮轮生意风潮。 一个设问是:在抖音…...
【网络教程】Python如何优雅的分割URL
文章目录 URL分割方法是一种用于解析URL字符串的方法,它可以将URL分解成不同的组成部分,如协议、域名、端口、路径等。在Python中,我们可以使用urllib.parse模块中的urlsplit方法来实现URL分割。 使用方法 下面是一个简单的示例代码,演示了如何使用urlsplit方法解析URL字符…...
1998-2014年工业企业数据库和绿色专利匹配
1998-2014年工业企业数据库绿色专利匹配 1、时间:1998-2014年 2、样本量:470万 3、来源:工业企业数据库、国家知识产权局、WIPO 4、指标: 企业匹配唯一标识码、组织机构代码、企业名称、年份、法定代表人、法定代表人职务、行…...
Python基于Mirai开发的QQ机器人保姆式教程(亲测可用)
在本教程中,我们将使用Python和Mirai来开发一个QQ机器人,本文提供了三个教学视频,包教包会,本文也很贴心贴了代码和相关文件。话不多说,直接开始教学。 目录 一、安装配置MIrai 图片验证码报错: 二、机器…...
算法笔记:堆
【如无特别说明,皆为最小二叉堆】 1 介绍 2 特性 结构性:符合完全二叉树的结构有序性:满足父节点小于子节点(最小化堆)或父节点大于子节点(最大化堆) 3 二叉堆的存储 顺序存储 二叉堆的有序…...
vue3 判断包含某个字符
<img v-if"node.level 1 && checkIfIncludeSubStr(node.label, 人口)"src"/assets/images/icon-convention-01.png" width"16"class"inlineBlock Vmiddle" style"margin-right: 8px;"/>const data reactive…...
MySQL的故事——查询性能优化
查询性能优化 文章目录 查询性能优化一、查询优化器的提示(hint)二、优化特定类型的查询 一、查询优化器的提示(hint) HIGH_PRIORITY和LOW_PRIORITY 这个提示告诉MySQL,当多个语句同时访问某一个表时,哪些语句的优先级相对高些,哪些相对低些…...
在外SSH远程连接macOS服务器【cpolar内网穿透】
文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …...
Nosql数据库服务之redis
Nosql数据库服务之redis 一图详解DB的分支产品 Nosql数据库介绍 是一种非关系型数据库服务,它能解决常规数据库的并发能力,比如传统的数据库的IO与性能的瓶颈,同样它是关系型数据库的一个补充,有着比较好的高效率与高性能。 专…...
当AI遇到IoT:开启智能生活的无限可能
文章目录 1. AI和IoT的融合1.1 什么是人工智能(AI)?1.2 什么是物联网(IoT)?1.3 AI和IoT的融合 2. 智能家居2.1 智能家居安全2.2 智能家居自动化 3. 医疗保健3.1 远程监护3.2 个性化医疗 4. 智能交通4.1 交通…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
