如何在不截图整页的前提下精准获取网页中动态刷新的CAPTCHA图像

20次阅读

如何在不截图整页的前提下精准获取网页中动态刷新的CAPTCHA图像

本文介绍一种基于 selenium 元素级截图 + opencv 预处理 + pytesseract ocr 的可靠方案,可精确捕获当前页面显示的 captcha 图像(而非重新请求生成的新图),避免因 url 重载导致的图像不一致问题。

自动化登录或表单提交场景中,若目标网站使用基于服务端动态生成的 CAPTCHA(如 如何在不截图整页的前提下精准获取网页中动态刷新的CAPTCHA图像),直接通过 get_attribute(‘src’) 再用 requests.get() 下载会导致获取到新生成的、与页面当前显示不一致的验证码图——因为每次 http 请求都会触发服务端生成全新图像。

正确解法是:跳过网络请求,直接从浏览器渲染缓冲区中提取该 如何在不截图整页的前提下精准获取网页中动态刷新的CAPTCHA图像 元素当前实际显示的像素数据。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% 获取用户当前所见图像

text=ZqhQzanResources