如何在不截图全页的情况下精准获取网页中动态刷新的 CAPTCHA 图像

发布时间 - 2025-12-31 00:00:00    点击率:

本文介绍一种基于 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 的同步难题,是自动化测试与爬虫中处理此类验证码的工业级实践方案。


# php  # python  # 浏览器  # 字节  # 工具  # ai  # 环境变量  # 爬虫  # webdriver  # 表单提交 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  JS经典正则表达式笔试题汇总  如何在云虚拟主机上快速搭建个人网站?  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何用景安虚拟主机手机版绑定域名建站?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何在服务器上配置二级域名建站?  网易LOFTER官网链接 老福特网页版登录地址  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  如何在万网主机上快速搭建网站?  晋江文学城电脑版官网 晋江文学城网页版直接进入  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  用v-html解决Vue.js渲染中html标签不被解析的问题  详解jQuery停止动画——stop()方法的使用  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel怎么判断请求类型_Laravel Request isMethod用法  如何快速搭建安全的FTP站点?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何续费美橙建站之星域名及服务?  如何用好域名打造高点击率的自主建站?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  BootStrap整体框架之基础布局组件  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  利用python获取某年中每个月的第一天和最后一天  制作电商网页,电商供应链怎么做?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Python文件操作最佳实践_稳定性说明【指导】  Laravel怎么为数据库表字段添加索引以优化查询  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何基于云服务器快速搭建个人网站?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel Docker环境搭建教程_Laravel Sail使用指南  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  在centOS 7安装mysql 5.7的详细教程  如何在IIS服务器上快速部署高效网站?  北京网站制作的公司有哪些,北京白云观官方网站?  大型企业网站制作流程,做网站需要注册公司吗?  如何在云指建站中生成FTP站点?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel如何使用Telescope进行调试?(安装和使用教程)  Android自定义listview布局实现上拉加载下拉刷新功能