
本文介绍一种基于 selenium 元素级截图 + opencv 预处理 + pytesseract ocr 的可靠方案,可精确捕获当前页面显示的 captcha 图像(而非重新请求生成的新图),避免因 url 重载导致的图像不一致问题。
在自动化登录或表单提交场景中,若目标网站使用基于服务端动态生成的 CAPTCHA(如 ),直接通过 get_attribute('src') 再用 requests.get() 下载会导致获取到新生成的、与页面当前显示不一致的验证码图——因为每次 HTTP 请求都会触发服务端生成全新图像。
正确解法是:跳过网络请求,直接从浏览器渲染缓冲区中提取该 元素当前实际显示的像素数据。Selenium 提供了 screenshot_as_png 属性,可对任意 WebElement 进行高保真局部截图(不依赖页面布局或滚动位置),这才是获取“所见即所得” CAPTCHA 图像的唯一可靠方式。
✅ 推荐实现步骤(Python + Selenium + OpenCV + Pytesseract)
from selenium import webdriver
from selenium.webdriver.common.by import By
import cv2
import numpy as np
import pytesseract
# 初始化 WebDriver(以 Chrome 为例)
driver = webdriver.Chrome()
driver.get("https://rds3.northsouth.edu/login") # 替换为目标登录页
# 定位 CAPTCHA 图片元素(推荐使用稳定定位器,如 id、class 或显式等待)
captcha_img = driver.find_element(By.ID, "captcha-img") # 注意:ID 名需根据实际 HTML 调整
# ✅ 关键:直接截取该元素当前渲染图像(字节流)
png_bytes = captcha_img.screenshot_as_png
# 保存为本地文件(可选,便于调试)
with open("captcha.png", "wb") as f:
f.write(png_bytes)
# 使用 OpenCV 加载并预处理(提升 OCR 准确率)
nparr = np.frombuffer(png_bytes, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
if img is None:
raise ValueError("Failed to decode CAPTCHA image")
# 灰度化 → 放大 → 二值化(Otsu 自适应阈值)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
h, w = gray.shape
resized = cv2.resize(gray, (w * 2, h * 2))
_, binary = cv2.threshold(resized, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 使用 Pytesseract 识别(建议配置 --psm 8 单行文本模式)
captcha_text = pytesseract.image_to_string(
binary,
config='--psm 8 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
).strip().replace(" ", "")
print("识别结果:", captcha_text)
# 自动填入输入框(示例)
input_field = driver.find_element(By.ID, "captcha-input")
input_field.send_keys(captcha_text)⚠️ 注意事项与优化建议
- 定位稳定性优先:务必使用 By.ID、By.CLASS_NAME 或 WebDriverWait 显式等待元素加载完成,避免因 DOM 未就绪导致 find_element 失败。
- *避免 `find_elementby已弃用方法**:Selenium 4+ 应统一使用driver.find_element(By.XXX, "...")`。
-
OCR 准确率提升技巧:
- 添加 --psm 8(假设单行文本)或 --psm 7(单行带空格);
- 使用 tessedit_char_whitelist 限制字符集(如仅数字+大小写字母),大幅降低误识率;
- 对简单 CAPTCHA,预处理(去噪、锐化、对比度增强)比复杂模型更有效。
- 不推荐“重新请求 src”方案:服务端通常对 /captcha 接口启用会话绑定或 Token 校验,单纯 GET 请求可能返回无效图或 403 错误。
- 合规提醒:请确保自动化行为符合目标网站《Robots.txt》及服务条款;生产环境建议配合人工复核或接入商业 OCR 服务(如 Google Vision、百度文字识别)以提升鲁棒性。
该方案已在多类教育系统、政务平台等含基础图形 CAPTCHA 的场景中稳定运行,核心优势在于完全规避服务端状态依赖,100% 获取用户当前所见图像。










