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),并结合自动化工具实现全流程自动化~

相关推荐
你好潘先生5 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师5 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码5 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf6 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes19 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户83562907805121 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent1 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6251 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python
SelectDB2 天前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
荣码2 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python