
本文介绍一种基于 selenium 元素级截图 + opencv 预处理 + pytesseract ocr 的可靠方案,直接捕获当前页面显示的 captcha 图像(而非重新请求 url),确保获取的是用户所见即所得的真实验证码。
在自动化登录或表单提交场景中,若目标网站使用动态生成的 CAPTCHA(如 ),直接通过 requests.get() 下载图片会导致获取到新生成的、与页面不一致的验证码——因为每次 HTTP 请求都会触发服务端生成全新图像。而全屏截图又效率低、易受干扰。正确解法是:对 CAPTCHA
元素执行原生元素截图(element screenshot),该操作捕获的是浏览器渲染后、当前时刻 DOM 中实际展示的像素,完全规避了 URL 重请求带来的不一致性。
Selenium WebDriver 提供了 .screenshot_as_png 属性(推荐使用 find_element(By.ID, "captcha-img") 等现代定位方式),可直接返回该元素的 PNG 字节流,无需依赖外部截图工具或坐标计算:
from selenium import webdriver
from selenium.webdriver.common.by import By
import cv2
import numpy as np
import pytesseract
# 初始化驱动(以 Chrome 为例)
driver = webdriver.Chrome()
driver.get("https://rds3.northsouth.edu/login")
# 定位 CAPTCHA 图片元素(确保 ID 或其他属性准确)
captcha_elem = driver.find_element(By.ID, "captcha-img") # 替换为实际的 id/class/xpath
# ✅ 关键步骤:获取元素当前渲染的 PNG 数据(非重新请求 src!)
captcha_png = captcha_elem.screenshot_as_png
# 保存为本地文件(可选,便于调试)
with open("captcha_raw.png", "wb") as f:
f.write(captcha_png)
# 使用 OpenCV 加载并预处理
nparr = np.frombuffer(captcha_png, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
if img is None:
raise ValueError("Failed to decode CAPTCHA image")
# 灰度化 → 放大 → 二值化(增强 OCR 可读性)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
h, w = gray.shape
resized = cv2.resize(gray, (w * 2, h * 2), interpolation=cv2.INTER_CUBIC)
_, binary = cv2.threshold(resized, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# OCR 识别(建议使用 --psm 8 处理单行文本)
text = pytesseract.image_to_string(
binary,
config='--psm 8 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
).strip().replace(" ", "")
print("Recognized CAPTCHA:", text)
# 自动填入输入框(示例)
input_elem = driver.find_element(By.ID, "captcha-input")
input_elem.send_keys(text)⚠️ 注意事项与优化建议:
- 元素可见性:确保 CAPTCHA 元素已加载且在视口内(可加 WebDriverWait(driver, 10).until(EC.visibility_of(captcha_elem)));
- OCR 准确率:简单扭曲/无噪点的 CAPTCHA 识别率可达 80%+;复杂类型需增加形态学操作(如去噪、连通域过滤)或训练自定义 Tesseract 模型;
- 反自动化防护:部分站点会禁用元素截图(罕见),此时需回退至带裁剪的全屏截图(结合 location_once_scrolled_into_view + size 计算坐标);
- 依赖安装:pip install selenium opencv-python numpy pytesseract,并配置 Tesseract OCR 引擎 环境变量(如 TESSDATA_PREFIX)。
该方法本质是“所见即所得”的图像捕获,从根本上解决了动态 CAPTCHA 的同步难题,是自动化测试与爬虫中处理此类验证码的工业级实践方案。










