
本文介绍一种基于 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% 获取用户当前所见图像。