【爬虫】实验项目三:验证码处理与识别

news2025/2/25 17:29:31

目录

一、实验目的

二、实验预习提示

三、实验内容

实验要求

基本要求:

改进要求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 ddddocr

DDDDOCR_DDDD_OCR = ddddocr.DdddOcr()


# 验证码处理
def codeDispose(v_code):
    ocr = DDDDOCR_DDDD_OCR
    res = ocr.classification(v_code.screenshot_as_png)
    # 验证码前面非字母数字 用空格替换
    res = re.sub('[^A-Za-z0-9]', '', res)
    return res


def 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的调用完成验证码识别。


        恭喜你成功地学完了我的所有爬虫内容!希望你已经获得了有用的信息和技巧,并且能够将其应用到实践中。如果有任何问题或疑虑,请随时与我联系。祝你好运!

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

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

相关文章

vue竖向步骤条

效果图&#xff1a; 弹框组件代码&#xff1a; <template><el-dialog:visible.sync"dialogVisible":append-to-body"true":close-on-click-modal"false":close-on-press-escape"false"titlewidth"8.2rem"custom-c…

Redis 缓存穿透、击穿、雪崩

一、缓存穿透 1、含义 缓存穿透是指查询一个缓存中和数据库中都不存在的数据&#xff0c;导致每次查询这条数据都会透过缓存&#xff0c;直接查库&#xff0c;最后返回空。 2、解决方案 1&#xff09;缓存空对象 就是当数据库中查不到数据的时候&#xff0c;我缓存一个空对象…

力扣:82. 删除排序链表中的重复元素 II(Python3)

题目&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - …

[NSSCTF 2nd] 2023 web方向和misc方向题解 wp

WEB php签到 直接给了源码。 是一个文件上传题目。分析一下源码。 <?phpfunction waf($filename){//黑名单$black_list array("ph", "htaccess", "ini");//得到文件后缀&#xff0c;【有漏洞】$ext pathinfo($filename, PATHINFO_EXTEN…

CData Drivers for SAS xpt Crack

CData Drivers for SAS xpt Crack 使用基于标准的驱动程序&#xff0c;加入数据库、报告工具和自定义程序中的实时SAS xpt(XPORT)数据文件。 与BI分析、报告、ETL工具和自定义解决方案集成。 适用于SAS xpt的CData驱动程序。神奇的功能&#xff1a; BI和分析 我们的驱动程序是将…

VCRUNTIME140_1.dll丢失是怎么回事?有哪些解决方法

今天&#xff0c;我这里与大家分享一个关于VCRUNTIME140_1.dll丢失修复的经验。相信很多网友在日常使用电脑的过程中&#xff0c;都会遇到这样的问题&#xff1a;程序无法运行&#xff0c;提示“缺少VCRUNTIME140_1.dll”的错误。那么&#xff0c;VCRUNTIME140_1.dll丢失是怎么…

[SpringBoot3]视图技术Thymeleaf

七、视图技术Thymeleaf Thymeleaf是一个表现层的模板引擎&#xff0c;一般被使用在Web环境中&#xff0c;它可以处理HTML、XML、JS等文档&#xff0c;简单来说&#xff0c;它可以将JSP作为Java Web应用的表现层&#xff0c;有能力展示与处理数据。这样&#xff0c;同一个模板文…

【OpenCV入门】第六部分——腐蚀与膨胀

文章结构 腐蚀膨胀开运算闭运算形态学方法梯度运算顶帽运算黑帽运算 腐蚀 腐蚀操作可以让图像沿着自己的边界向内收缩。OpenCV通过”核“来实现收缩计算。“核”在形态学中可以理解为”由n个像素组成的像素块“&#xff0c;像素块包含一个核心&#xff08;通常在中央位置&…

leetcode 1326. Minimum Number of Taps to Open to Water a Garden

x轴上的花园范围为[0,n], 0~n这个n1个离散点上有水龙头&#xff0c;第 i 个水龙头能浇水的范围为[i-ranges[i], iranges[i]]. 求能浇整个花园的最小水龙头个数。 思路&#xff1a; 方法一&#xff1a; greedy 先把每个水龙头能浇的区间准备好&#xff0c; 用一个数组保存所有…

Node.js 应用的御用品: Node.js 错误处理系统

开发中&#xff0c;有些开发者会积极寻求处理错误&#xff0c;力求减少开发时间&#xff0c;但也有些人完全忽略了错误的存在。正确处理错误不仅意味着能够轻松发现和纠正错误&#xff0c;而且还意味着能够为大型应用程序开发出稳健的代码库。 特别是对于 Node.js 开发人员&am…

uniapp项目实践总结(六)自定义顶部导航栏

本篇主要讲述如何自定义顶部导航栏,有时候默认导航栏不足以满足我们的需求,这时候就需要自定义导航栏来解决这个问题。 目录 默认导航修改配置自定义顶部默认导航 自带的默认顶部导航设置的内容有限,不容易扩展修改,因此如果有更加个性化的需求,则需要自定义顶部导航。 …

中文句子关系推断

本文通过ChnSentiCorp数据集介绍了中文句子关系推断任务过程&#xff0c;主要使用预训练语言模型bert-base-chinese直接在测试集上进行测试&#xff0c;也简要介绍了模型训练流程&#xff0c;不过最后没有保存训练好的模型。 一.任务简介和数据集 通过模型来判断2个句子是否连…

Gazebo仿真环境下的强化学习实现

Gazebo仿真环境下的强化学习实现 主体源码参照《Goal-Driven Autonomous Exploration Through Deep Reinforcement Learning》 文章目录 Gazebo仿真环境下的强化学习实现1. 源码拉取2. 强化学习实现2.1 环境2.2 动作空间2.3 状态空间2.4 奖励空间2.5 TD3训练 3. 总结 1. 源码…

【LeetCode算法系列题解】第41~45题

CONTENTS LeetCode 41. 缺失的第一个正数&#xff08;困难&#xff09;LeetCode 42. 接雨水&#xff08;困难&#xff09;LeetCode 43. 字符串相乘&#xff08;中等&#xff09;LeetCode 44. 通配符匹配&#xff08;困难&#xff09;LeetCode 45. 跳跃游戏 II&#xff08;中等&…

字符和字符串的库函数模拟与实现

前言&#xff1a; 相信大家平常在写代码的时候&#xff0c;用代码解决实际问题时苦于某种功能的实现&#xff0c;而望而止步&#xff0c;这个时候库函数的好处就体现出来了&#xff0c;当然个人代码编写能力强的可以自己创建一个函数&#xff0c;不过相当于库函数来说却是浪费了…

SSM 基于注解的整合实现

一、pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelV…

C++的基类和派生类构造函数

基类的成员函数可以被继承&#xff0c;可以通过派生类的对象访问&#xff0c;但这仅仅指的是普通的成员函数&#xff0c;类的构造函数不能被继承。构造函数不能被继承是有道理的&#xff0c;因为即使继承了&#xff0c;它的名字和派生类的名字也不一样&#xff0c;不能成为派生…

CSC2121A

半桥架构的栅极驱动电路CSC2121A CSC2121系列是一款高性价比的半桥架构的栅极驱动专用电路&#xff0c;用于大功率MOS管、IGBT管栅极驱动。IC内部集成了逻辑信号处理电路、死区时间控制电路、欠压保护电路、电平位移电路、脉冲滤波电路及输出驱动电路&#xff0c;专用于无刷电…

ClickHouse配置Hdfs存储数据

文章目录 背景配置单机配置HA高可用Hdfs集群参考文档 背景 由于公司初始使用Hadoop这一套&#xff0c;所以希望ClickHouse也能使用Hdfs作为存储 看了下ClickHouse的文档&#xff0c;拿Hdfs举例来说&#xff0c;有两种方式来完成&#xff0c;一种是直接关联Hdfs上的数据文件&am…

【python爬虫案例】用python爬豆瓣音乐TOP250排行榜!

文章目录 一、爬虫对象-豆瓣音乐TOP250二、python爬虫代码讲解三、同步视频四、获取完整源码 一、爬虫对象-豆瓣音乐TOP250 您好&#xff0c;我是 马哥python说 &#xff0c;一名10年程序猿。 今天我们分享一期python爬虫案例讲解。爬取对象是&#xff0c;豆瓣音乐TOP250排行…