突破验证壁垒:SeleniumBase+Tesseract OCR全自动识别方案
你是否还在为自动化测试中的验证而头疼?手动输入效率低下,第三方服务成本高昂?本文将带你实现从0到1的验证自动化识别方案,基于SeleniumBase框架集成Tesseract OCR引擎,彻底解决Web自动化中的验证痛点。读完本文你将掌握:
- Tesseract OCR与SeleniumBase的无缝集成
- 验证图片预处理关键技术
- 抗干扰识别优化策略
- 真实场景下的验证识别案例
技术选型与环境准备
核心组件介绍
SeleniumBase作为顶级Web自动化框架,提供了undetected-chromedriver模块绕过网站反爬机制,而Tesseract OCR则是Google开源的光学字符识别引擎。两者结合可构建完整的验证识别闭环:
环境安装命令
# 安装SeleniumBase(包含undetected-chromedriver)
pip install seleniumbase
# 安装Tesseract OCR引擎
# Ubuntu/Debian
sudo apt install tesseract-ocr
# macOS
brew install tesseract
# Windows
choco install tesseract
详细安装指南参见SeleniumBase官方文档和Tesseract安装说明
核心实现原理
验证识别流程
- 元素定位:使用SeleniumBase的
find_element()方法定位验证图片元素 - 屏幕截图:通过
save_screenshot()获取完整页面,再根据元素坐标裁剪出验证区域 - 图像预处理:应用灰度转换、降噪、二值化等操作增强识别率
- OCR识别:调用Tesseract识别处理后的图像
- 结果校验:将识别结果填入表单并验证是否成功
关键代码实现
创建文件examples/captcha_solver.py,实现基础验证识别类:
from seleniumbase import SB
import pytesseract
from PIL import Image, ImageEnhance, ImageFilter
import numpy as np
class CaptchaSolver:
def __init__(self, sb):
self.sb = sb # SeleniumBase实例
self.tesseract_path = "/usr/bin/tesseract" # 根据系统调整路径
def preprocess_image(self, img_path):
"""图像预处理:灰度化→降噪→二值化"""
img = Image.open(img_path)
# 转为灰度图
img = img.convert('L')
# 增强对比度
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(2.0)
# 中值滤波降噪
img = img.filter(ImageFilter.MedianFilter(size=3))
# 二值化处理
threshold = 150
img = img.point(lambda p: p > threshold and 255)
return img
def solve(self, element_selector):
"""主识别函数"""
# 定位验证元素
captcha_element = self.sb.find_element(element_selector)
# 截图并裁剪验证区域
self.sb.save_screenshot("full_page.png")
location = captcha_element.location
size = captcha_element.size
x1, y1 = int(location['x']), int(location['y'])
x2, y2 = x1 + int(size['width']), y1 + int(size['height'])
# 裁剪并预处理
full_img = Image.open("full_page.png")
captcha_img = full_img.crop((x1, y1, x2, y2))
captcha_img.save("captcha_raw.png")
# 预处理图像
processed_img = self.preprocess_image("captcha_raw.png")
processed_img.save("captcha_processed.png")
# Tesseract OCR识别
result = pytesseract.image_to_string(
processed_img,
config='--psm 8 -c tessedit_char_whitelist=ABCDEFGHJKLMNPQRSTUVWXYZ23456789'
)
return result.strip()
实战案例:Bing验证识别
完整代码实现
以Bing搜索的验证为例,使用上述CaptchaSolver类实现自动识别:
from seleniumbase import SB
from captcha_solver import CaptchaSolver # 导入上文实现的类
with SB(uc=True, test=True, incognito=True) as sb:
# 访问带验证的页面
sb.open("https://www.bing.com/turing/captcha/challenge")
# 初始化验证求解器
solver = CaptchaSolver(sb)
# 识别并输入验证
captcha_code = solver.solve("img#captchaImage")
sb.type("#captchaInput", captcha_code)
# 提交表单
sb.click("#submitButton")
# 验证是否成功
if sb.is_element_present("#successMessage"):
sb.post_message("验证识别成功!", duration=3)
else:
sb.post_message(f"识别失败,尝试字符: {captcha_code}", duration=3)
实际项目中建议添加重试机制,参考examples/raw_bing_captcha.py的实现
识别效果优化
针对复杂背景的验证,需要添加高级预处理:
# 高级预处理函数(添加到CaptchaSolver类)
def advanced_preprocess(self, img_path):
img = Image.open(img_path).convert('L')
# 自适应阈值二值化
arr = np.array(img)
arr = np.where(arr > np.mean(arr) * 1.2, 255, 0).astype(np.uint8)
# 形态学操作去除噪点
from scipy.ndimage import binary_opening
arr = binary_opening(arr, structure=np.ones((2,2))).astype(np.uint8)
return Image.fromarray(arr)
常见问题与解决方案
识别率低下问题
| 问题原因 | 解决方案 | 参考代码 |
|---|---|---|
| 字符粘连 | 腐蚀/膨胀操作 | img.filter(ImageFilter.MinFilter(3)) |
| 背景干扰 | 添加边框 | ImageOps.expand(img, border=10, fill='white') |
| 倾斜字符 | 透视变换 | 使用OpenCV的warpAffine |
反爬机制应对
网站可能通过以下方式阻止自动化识别:
- 动态验证:使用SeleniumBase的CDP模式拦截网络请求
- 行为检测:添加随机延迟和人类行为模拟
# 模拟人类输入速度
sb.type("#captchaInput", captcha_code, delay=0.2)
# 随机鼠标移动
sb.move_to_element_randomly("#submitButton")
总结与扩展
本文实现的方案已成功应用于examples/raw_recaptcha.py等测试场景。对于更复杂的验证(如reCAPTCHA v2),可结合:
- 深度学习模型:训练CNN模型识别复杂验证
- 第三方服务:集成打码平台API作为备用方案
- 音频识别:调用Tesseract的音频识别功能处理语音验证
建议定期更新SeleniumBase和Tesseract版本以获取最新特性支持。最后附上项目地址:GitHub_Trending/se/SeleniumBase
点赞+收藏本文,下期将带来《突破reCAPTCHA v3:行为分析绕过技术》
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



