python识别验证码

要实现验证码自动识别与填写,需分步骤结合图像识别(OCR)和自动化操作技术。以下是详细方案(以 Web 页面为例,App 逻辑类似,需替换自动化工具):

一、核心思路

  1. 获取验证码图片:从页面中定位并截取验证码区域。

  2. OCR 识别验证码:通过图像识别技术提取验证码字符。

  3. 自动填写验证码:将识别结果输入到验证码输入框,完成后续操作(如点击"登录/注册")。

二、步骤拆解与代码实现

🔹 步骤 1:获取验证码图片(Web 场景)

假设目标是 Web 页面,需用Selenium定位验证码图片并下载:

python 复制代码
from selenium import webdriver
import requests

# 1. 启动浏览器并打开目标页面
driver = webdriver.Chrome()  # 需提前安装 ChromeDriver
driver.get("https://目标网站.com/login")  # 替换为实际 URL

# 2. 定位验证码图片元素(需根据页面结构修改 XPath/CSS 选择器)
captcha_img = driver.find_element_by_xpath("//img[contains(@src, 'captcha')]")  
img_url = captcha_img.get_attribute("src")  # 获取图片的网络地址

# 3. 下载验证码图片到本地
response = requests.get(img_url)
with open("captcha.png", "wb") as f:
    f.write(response.content)

driver.quit()  # 关闭浏览器(后续识别完再启动也可)
  

🔹 步骤 2:OCR 识别验证码

需根据验证码复杂度选择技术方案:

方案 A:简单验证码(无干扰、清晰)→ Tesseract-OCR

Tesseract 是开源 OCR 引擎,适合简单场景。需安装 pytesseract 和 Tesseract 引擎(https://github.com/tesseract-ocr/tesseract)。

python 复制代码
import cv2
import pytesseract

# 1. 读取验证码图片
img = cv2.imread("captcha.png")

# 2. 图像预处理(提升识别率,可选步骤)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)       # 转灰度
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]  # 二值化
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))  # 形态学去噪
clean = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)  

# 3. 识别文字(配置参数优化:单字符模式、引擎模式)
text = pytesseract.image_to_string(clean, lang="eng", config="--psm 8 --oem 3")  
captcha = text.strip()  # 清理空格/换行
print(f"识别结果:{captcha}")

方案 B:复杂验证码(含干扰线、扭曲、彩色)→ 第三方 OCR API

若 Tesseract 识别率低,推荐用百度/腾讯/阿里云文字识别 API(需注册获取密钥,适合付费或高精度需求)。以百度 AI 开放平台为例:

  1. 注册百度 AI,创建应用,获取 API Key 和 Secret Key。

  2. 调用通用文字识别 API(示例代码):

python 复制代码
import requests
import base64

def get_baidu_access_token():
    """获取百度 OCR 的 Access Token"""
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {
        "grant_type": "client_credentials",
        "client_id": "你的API_Key",
        "client_secret": "你的Secret_Key"
    }
    res = requests.get(url, params=params)
    return res.json().get("access_token")

def ocr_captcha_with_baidu(image_path):
    """调用百度 OCR 识别验证码"""
    access_token = get_baidu_access_token()
    with open(image_path, "rb") as f:
        img_base64 = base64.b64encode(f.read()).decode()
    
    url = f"https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={access_token}"
    headers = {"Content-Type": "application/x-www-form-urlencoded"}
    data = {"image": img_base64}
    res = requests.post(url, headers=headers, data=data)
    if "words_result" in res.json():
        return "".join([item["words"] for item in res.json()["words_result"]])
    return ""

captcha = ocr_captcha_with_baidu("captcha.png")
print(f"百度 OCR 识别结果:{captcha}")
  

🔹 步骤 3:自动填写验证码

识别出验证码后,用自动化工具(如 Selenium)填充到输入框:

python 复制代码
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://目标网站.com/login")  # 重新打开页面(或复用之前会话)

# 定位验证码输入框并填写
captcha_input = driver.find_element_by_xpath("//input[@placeholder='请输入手机验证码']")
captcha_input.send_keys(captcha)  # 填入识别结果

# (可选)后续操作:点击"登录/注册"
login_btn = driver.find_element_by_xpath("//button[text()='登录/注册']")
login_btn.click()

driver.quit()

三、进阶注意事项

  1. 验证码时效性:多数验证码有过期时间(如 60 秒),需优化流程速度(减少截图、网络请求耗时)。

  2. 反爬对抗:部分网站会检测 Selenium 等自动化工具(如识别 WebDriver 特征),需做反反爬:

• 隐藏 WebDriver 标识:options.add_argument("--disable-blink-features=AutomationControlled")

• 模拟人工操作延迟:time.sleep(1) 模拟思考时间。

  1. 复杂验证码处理:若为滑动、点选、行为验证码,需用专用自动化工具(如 Selenium 模拟拖拽、Appium 模拟手势)或打码平台(如超级鹰、若快)。

四、总结流程

定位截图验证码 → OCR 识别字符 → 自动化填写 → 完成登录/注册

根据验证码复杂度和使用场景,灵活选择 OCR 方案(开源 Tesseract 或付费 API),并结合自动化工具实现全流程自动化~

相关推荐
2601_956319889 小时前
期货夜盘无人值守监控什么:断线、无成交与拒单信号
python·区块链
CTA终结者9 小时前
期货量化目标仓和净持仓对不齐:天勤 TargetPosTask 与 pos 偏差排查
python·区块链
科技林总9 小时前
解决vllm服务漏扫问题
python·安全
醇氧9 小时前
【Linux】Java 服务生产级部署指南:实现常驻后台、开机自启与系统服务化管理
java·开发语言
凡人叶枫9 小时前
Effective C++ 条款16:成对使用 new 和 delete 时要采取相同形式
开发语言·c++·effective c++
不吃土豆的马铃薯10 小时前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++
数据法师10 小时前
QuickSay :基于 Qt 的轻量级快捷短语管理工具
开发语言·qt
caimouse10 小时前
Reactos 第1章 概述
c语言·开发语言·架构
.千余10 小时前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他
财经资讯数据_灵砚智能10 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月10日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能