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

目录

一、实验目的

二、实验预习提示

三、实验内容

实验要求

基本要求:

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

五、源码如下

python">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. 实验框架代码:

python">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.niftyadmin.cn/n/4992296.html

相关文章

解决小程序中textarea ios端样式不兼容的方法

问题描述 ,今天在调试小程序的时候有个需求需要textarea与标题对其,微信开发工具和安卓系统都没有问题 但是ios系统textarea存在内边距。出现不兼容的情况 解决方法:我们看官网的textarea的属性 textarea | uni-app官网 disable-default-p…

Arco Design Pro 配置

垂直菜单更改为水平菜单 打开 src/config/setting.json{"theme": "light","colorWeak": false,"navbar": true,"menu": true,"topMenu": true,"hideMenu": false,"menuCollapse": false,&qu…

菜鸟教程《Python 3 教程》笔记(14):函数

菜鸟教程《Python 3 教程》笔记(14) 14 函数14.1 参数传递14.1.1 可更改(mutable)与不可更改(immutable)对象14.1.2 python 传不可变对象实例 14.2 参数14.2.1 必需参数14.2.2 关键字参数14.2.3 默认参数14.2.4 不定长参数 14.3 匿名函数14.4 强制位置参…

耐蚀点蚀镀铜工艺

引言 随着5G技术的推出,导致电子电路和IC基板在设计中要求更高的密度。由于5G应用的性质,这些设计中的高可靠性和出色的电气性能也越来越重要。为了满足5G应用和其他下一代设备平台的需求,逐渐建立了使用改良半加成加工(mSAP)制造电路板的制…

openGauss学习笔记-57 openGauss 高级特性-并行查询

文章目录 openGauss学习笔记-57 openGauss 高级特性-并行查询57.1 适用场景与限制57.2 资源对SMP性能的影响57.3 其他因素对SMP性能的影响57.4 配置步骤 openGauss学习笔记-57 openGauss 高级特性-并行查询 openGauss的SMP并行技术是一种利用计算机多核CPU架构来实现多线程并行…

自用的markdown与latex特殊符号

\triangleq \approx \xlongequal[y\arctan x]{x\tan y} \sum_{\substack{j1 \\ j\neq i}} \iiint\limits_\Omega \overset{\circ}{\vec{r}} \varphi \checkmark \stackrel{\cdot\cdot\cdot}{x}≜ ≈ y arctan ⁡ x x tan ⁡ y ∑ j 1 j ≠ i ∭ Ω r ⃗ ∘ φ ✓ x ⋅ ⋅ ⋅…

一百七十、Linux——Crontab定时任务调度Kettle脚本

一、目的 由于用海豚调度器调度从Kafka到HDFS的kettle任务时发现有点问题,如果不设置定时调度,这个kettle任务会一直跑,而如果设置定时调度,隔天后就会生成多个任务,而且每个任务都在跑,不会停下&#xff…

jmeter 固定定时器

固定定时器(Constant Timer)是一个定时器元件,可以在线程组中的每个线程之间添加固定的延迟时间。固定定时器会对每个线程的执行进行一定的暂停。 聊一下和线程组中的调度器对线程组执行时长的影响: 相同: 都会影响线…