如何在不截图全页的情况下精准获取网页中动态刷新的 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布局实现上拉加载下拉刷新功能

