算術圖片驗證碼(四則運算)+selenium

一、表達式解析

這里假設已經識別出來表達式,如何識別驗證碼圖片里的表達式,放在下面講。涉及到的正則表達式的解析放在本篇文章最后面。


import re
# 表達式解析(支持小數的 +-*/ 和中文運算符)
def parse_math_expression(text):# 替換中文運算符為英文text = text.replace('加', '+').replace('減', '-').replace('乘', '*').replace('除', '/')text = text.replace('x', '*').replace('X', '*').replace('÷', '/')# 正則表達式提取表達式中的數字和運算符# match = re.search(r'(\d+)\s*([+\-*/]|加|減|乘|除)\s*(\d+)', text)match = re.search(r'(\d+(?:\.\d+)?)\s*([+\-*/]|加|減|乘|除)\s*(\d+(?:\.\d+)?)', text) # 可匹配小數if not match:return Nonenum1, operator, num2 = match.groups()try:num1 = float(num1)num2 = float(num2)# 計算結果if operator == '+':result = num1 + num2elif operator == '-':result = num1 - num2elif operator == '*':result = num1 * num2elif operator == '/':result = num1 / num2else:return None# 要么返回整數,要么返回最多兩位小數,round()四舍六入五平分,如果五平分的進位不對,刷新頁面重新識別吧,懶得處理了return int(result) if result.is_integer() else round(result, 2)except:return None# 調試用
ocr_result = "9.1加3.2等于"result = parse_math_expression(ocr_result)
if result is not None:print(f"計算結果: {result}")else:print("無法解析表達式")

二、配合selenium

#!/usr/bin/env python
# encoding: utf-8from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import ddddocr
import re# 表達式解析(支持 +-*/ 和中文運算符)
def parse_math_expression(text):# 替換中文運算符為英文text = text.replace('加', '+').replace('減', '-').replace('乘', '*').replace('除', '/')text = text.replace('x', '*').replace('X', '*').replace('÷', '/')# 正則表達式提取表達式中的數字和運算符# match 對象包含匹配成功的信息,若未匹配到則返回 None# match = re.search(r'(\d+)\s*([+\-*/]|加|減|乘|除)\s*(\d+)', text) #匹配整數match = re.search(r'(\d+(?:\.\d+)?)\s*([+\-*/]|加|減|乘|除)\s*(\d+(?:\.\d+)?)', text) # 可匹配小數if not match:return Nonenum1, operator, num2 = match.groups() #groups()	僅包含捕獲組,索引從 0 開始,如('3.14', '乘', '2.71')try:num1 = float(num1)num2 = float(num2)# 計算結果if operator == '+':result = num1 + num2elif operator == '-':result = num1 - num2elif operator == '*':result = num1 * num2elif operator == '/':result = num1 / num2else:return None# 要么返回整數,要么返回最多兩位小數,round()四舍六入五平分,如果五平分的進位不對,刷新頁面重新識別吧return int(result) if result.is_integer() else round(result, 2)except:return None# 配置瀏覽器
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(5)# 打開驗證碼頁面
driver.get('http://127.0.0.1/1.html')
time.sleep(2)  # 等待頁面加載# 獲取驗證碼圖片
captcha_element = driver.find_element(By.ID, 'captcha')
captcha_png = captcha_element.screenshot_as_png# 初始化 OCR 引擎(支持中文運算符)
ocr = ddddocr.DdddOcr(show_ad=False)
# OCR 識別
ocr_result = ocr.classification(captcha_png)
print(f"OCR 識別結果: {ocr_result}")# 計算表達式結果
# ocr_result = '9.14加3.15等于' # debug使用
result = parse_math_expression(ocr_result)if result is not None:print(f"計算結果: {result}")# 自動填寫結果(假設輸入框 ID 為 'captcha_input')input_element = driver.find_element(By.ID, 'captcha_input')input_element.send_keys(str(result))# 提交表單(假設按鈕 ID 為 'submit')submit_button = driver.find_element(By.ID, 'submit')submit_button.click()print("已提交表單")
else:print("無法解析表達式")# 等待用戶查看結果后關閉瀏覽器
time.sleep(5)
driver.quit()

三、引申:正則表達式搭配group()

group() 是 Python 正則表達式模塊 re 中用于提取匹配結果的核心方法,必須與正則表達式的匹配對象(Match 對象)搭配使用。

1. group()基本定義

  • match.group(n):返回正則表達式中第 n 個捕獲組的匹配內容。
  • match.group(0):返回整個匹配的字符串(即正則表達式匹配到的完整文本)。
import retext = "今天是2023-06-07"
regex = r'(\d{4})-(\d{2})-(\d{2})'  # 三個捕獲組:年、月、日
match = re.search(regex, text)if match:print(match.group(0))  # 整個匹配: "2023-06-07"print(match.group(1))  # 第一個捕獲組: "2023"print(match.group(2))  # 第二個捕獲組: "06"print(match.group(3))  # 第三個捕獲組: "07"

注意:match.groups()跟match.group()是不一樣的,groups()返回內容僅包含捕獲組(即括號()中定義的內容),不包含整個匹配結果。上面的算術代碼用的是groups()。

2. 例子中的正則表達式解析

(1)(\d+(?:.\d+)?) 匹配整數或小數

部分含義示例匹配
\.匹配小數點(. 需要轉義).
\d+匹配 1 個或多個數字14、5
(?:...)非捕獲組(不創建分組)僅用于分組,不保存結果
?前面的內容可選(0 次或 1 次).14、空字符串

(2)空白字符 \s*

  • \s:匹配任意空白字符(空格、制表符、換行等)
  • *:匹配 0 次或多次(即可有可無)

(3)運算符部分 ([+-*/]|加|減|乘|除)

  • 邏輯或 |:分隔多個可選模式,匹配其中任意一個
  • 分組 ():捕獲匹配的內容,便于后續提取 [ ] :字符組,匹配其中任意一個字符
  • 需要轉義(-),否則表示范圍(如 [0-9])
  • +、* 理論上需要轉義,但多數引擎允許不轉義

四、用到的驗證碼識別庫ddddocr

DdddOcr 帶帶弟弟OCR通用驗證碼離線本地識別SDK免費開源版
(鏈接包含各種強大用法的使用文檔,感興趣可看,如下圖)
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86174.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 Laravel 中的自定義存根簡化工作

在開發與外部服務、API 或復雜功能交互的應用程序時,測試幾乎總是很困難。簡化測試的一種方法是使用存根類。以下是我通常使用它們的方法。 福利簡介 存根是接口或類的偽實現,用于模擬真實服務的行為。它們允許您: 無需調用外部服務即可測試…

將 tensorflow keras 訓練數據集轉換為 Yolo 訓練數據集

以 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 為例 1. 圖像分類數據集文件結構 (例如用于 yolov11n-cls.pt 訓練) import os import csv import random from PIL import Image from sklearn.model_selection import train_test_split import s…

排序算法-歸并排序與快速排序

歸并排序與快速排序 快速排序是利用的遞歸思想:選取一個基準數,把小于基準數的放左邊 大于的放右邊直到整個序列有序 。快排分割函數 O(lognn), 空間 :沒有額外開辟新的數組但是遞歸樹調用函數會占用棧內存 O(logn) 。 歸并排序:在遞歸返回的…

北大開源音頻編輯模型PlayDiffusion,可實現音頻局部編輯,比傳統 AR 模型的效率高出 50 倍!

北大開源了一個音頻編輯模型PlayDiffusion,可以實現類似圖片修復(inpaint)的局部編輯功能 - 只需修改音頻中的特定片段,而無需重新生成整段音頻。此外,它還是一個高性能的 TTS 系統,比傳統 AR 模型的效率高出 50 倍。 自回歸 Tra…

MyBatis————入門

1,配置相關 我們上一期詳細講了一下使用注解來實現操作數據庫的方式,我們今天使用xml來實現,有同學可能有疑問,使用注解挺方便呀,為啥還要注解呀,先來說一下注解我感覺挺麻煩的,但是我們后面要…

【推薦算法】推薦算法演進史:從協同過濾到深度強化學習

推薦算法演進史:從協同過濾到深度強化學習 一、傳統推薦時代:協同過濾的奠基(1990s-2006)1.1 算法背景:信息爆炸的挑戰1.2 核心算法:協同過濾1.3 局限性 二、深度學習黎明:神經網絡初探&#xf…

Java基于SpringBoot的校園閑置物品交易系統,附源碼+文檔說明

博主介紹:?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? 🍅文末獲取源碼聯系🍅 👇🏻 精彩專欄推薦訂閱👇&…

Ajax Systems公司的核心產品有哪些?

Ajax Systems 是一家專注于家庭安全和智能系統的公司,其核心產品如下3: 入侵保護設備:如 MotionCam Outdoor 無線室外運動探測器,配備內置攝像頭和兩個紅外傳感器,可通過預裝電池運行長達三年,能在 15 米距…

64、js 中require和import有何區別?

在 JavaScript 中,require 和 import 都是用于模塊導入的語法,但它們屬于不同的模塊系統,具有顯著的區別: 1. 模塊系統不同 require 屬于 CommonJS 模塊系統(Node.js 默認使用)。 語法:const…

Java+Access綜合測評系統源碼分享:含論文、開題報告、任務書全套資料

JAVAaccess綜合測評系統畢業設計 一、系統概述 本系統采用Java Swing開發前端界面,結合Access數據庫實現數據存儲,專為教育機構打造的綜合測評解決方案。系統包含學生管理、題庫管理、在線測評、成績分析四大核心模塊,實現了測評流程的全自…

【python】RGB to YUV and YUV to RGB

文章目錄 1、YUV2、YUV vs RGB3、RGB to YUV4、YUV to RGB附錄——YUV NV12 vs YUV NV21參考1、YUV YUV 顏色空間,又常被稱作 YCbCr 顏色空間,是用于數字電視的顏色空間,在 ITU-R BT.601、BT.709、BT.2020 標準中被明確定義,這三種標準分別針對標清、高清、超高清數字電視…

運行示例程序和一些基本操作

歡迎 ----> 示例 --> 選擇sample CTRL B 編譯代碼 CTRL R 運行exe 項目 中 Shadow build 表示是否 編譯生成文件和 源碼是否放一塊 勾上不在同一個地方 已有項目情況下怎么打開項目 方法一: 左鍵雙擊 xxx.pro 方法二: 文件菜單里面 選擇打開項目

計算機網絡第2章(下):物理層傳輸介質與核心設備全面解析

目錄 一、傳輸介質1.1 傳輸介質的分類1.2 導向型傳輸介質1.2.1 雙絞線(Twisted Pair)1.2.2 同軸電纜(Coaxial Cable)1.2.3 光纖(Optical Fiber)1.2.4 以太網對有線傳輸介質的命名規則 1.3 非導向型傳輸介質…

PHP文件包含漏洞詳解:原理、利用與防御

PHP文件包含漏洞詳解:原理、利用與防御 什么是文件包含漏洞? 文件包含漏洞是PHP應用程序中常見的安全問題,當開發者使用包含函數引入文件時,如果傳入的文件名參數未經嚴格校驗,攻擊者就可能利用這個漏洞讀取敏感文件…

5.4.2 Spring Boot整合Redis

本次實戰主要圍繞Spring Boot與Redis的整合展開,首先創建了一個Spring Boot項目,并配置了Redis的相關屬性。接著,定義了三個實體類:Address、Family和Person,分別表示地址、家庭成員和個人信息,并使用Index…

java內存模型JMM

Java 內存模型(Java Memory Model,JMM)定義了 Java 程序中的變量、線程如何和本地內存以及主內存進行交互的規則。它主要涉及到多線程環境下的共享變量可見性、指令重排等問題,是理解并發編程中的關鍵概念。 核心概念&#xff1a…

配置git命令縮寫

以下是 Git 命令縮寫的配置方法及常用方案,適用于 Linux/macOS/Windows 系統: 🔧 一、配置方法 1. 命令行設置(推薦) # 基礎命令縮寫 git config --global alias.st status git config --global alias.co che…

準確--k8s cgroup問題排查

k8s cgroup問題排查 6月 06 17:20:39 k8s-node01 containerd[1515]: time"2025-06-06T17:20:39.42902033408:00" levelerror msg"StartContainer fo r \"46ae0ef9618b96447a1f28fd2229647fe671e8acbcec02c8c46b37051130c8c4\" failed" error&qu…

Go 中 map 的雙值檢測寫法詳解

Go 中 map 的雙值檢測寫法詳解 在 Go 中,if char, exists : pairs[s[i]]; exists { 是一種利用 Go 語言特性編寫的優雅條件語句,用于檢測 map 中是否存在某個鍵。讓我們分解解釋這種寫法: 語法結構解析 if value, ok : mapVariable[key]; …

C# Wkhtmltopdf HTML轉PDF碰到的問題

最近碰到一個Html轉PDF的需求,看了一下基本上都是需要依賴Wkhtmltopdf,需要在Windows或者linux安裝這個可以后使用。找了一下選擇了HtmlToPDFCore,這個庫是對Wkhtmltopdf.NetCore簡單二次封裝,這個庫的好處就是通過NuGet安裝HtmlT…