Python自动化实战:Selenium+百度OCR实现验证码自动登录
2025.09.19 14:30浏览量:28简介:本文详细介绍如何使用Python的Selenium库实现网站自动登录,并结合百度文字识别(Baidu-AIP)破解验证码,提供从环境配置到完整代码实现的分步指南。
一、技术选型与原理说明
1.1 Selenium自动化框架
Selenium是浏览器自动化测试的核心工具,通过模拟用户操作实现页面交互。其WebDriver接口支持Chrome、Firefox等主流浏览器,可精准定位DOM元素、填写表单、点击按钮等操作。相比机械式键盘模拟,Selenium直接操作浏览器内核,具有更高的兼容性和稳定性。
1.2 百度文字识别(Baidu-AIP)
百度OCR提供通用文字识别、高精度识别等接口,其中”精准基本版”对印刷体数字字母的识别准确率达99%以上。通过API调用可快速获取验证码文本内容,相比传统OCR库(如Tesseract),无需训练模型即可直接使用,特别适合验证码这类结构化文本识别场景。
1.3 系统架构设计
整体流程分为三步:
- Selenium定位登录页面并填写用户名/密码
- 截取验证码图片区域并保存
- 调用百度OCR接口解析验证码文本
- 将识别结果填入输入框并提交表单
二、环境配置与依赖安装
2.1 基础环境要求
- Python 3.6+
- Chrome浏览器(建议v86+)
- 对应版本的ChromeDriver
- 百度AI开放平台账号(免费获取API Key)
2.2 依赖库安装
pip install selenium pillow requests baidu-aip
关键库说明:
selenium: 浏览器自动化核心Pillow: 图像处理(验证码截取与预处理)requests: HTTP请求(调用百度OCR API)baidu-aip: 百度AI官方SDK(可选)
2.3 百度OCR配置
- 登录百度AI开放平台创建应用
- 获取API Key和Secret Key
- 启用”通用文字识别”服务(免费版每日500次调用)
三、核心代码实现
3.1 浏览器初始化
from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsdef init_browser():chrome_options = Options()chrome_options.add_argument("--disable-infobars") # 禁用提示条chrome_options.add_argument("--start-maximized") # 最大化窗口driver = webdriver.Chrome(options=chrome_options)return driver
关键参数说明:
--headless: 无头模式(生产环境推荐)--disable-gpu: 禁用GPU加速(避免兼容问题)--no-sandbox: 在Docker环境中使用
3.2 验证码识别模块
from aip import AipOcrimport base64class BaiduOCR:def __init__(self, app_id, api_key, secret_key):self.client = AipOcr(app_id, api_key, secret_key)def recognize(self, image_path):with open(image_path, 'rb') as f:image = base64.b64encode(f.read())result = self.client.basicGeneral(image)if result and 'words_result' in result:return result['words_result'][0]['words']return None
异常处理建议:
- 添加重试机制(网络波动可能导致失败)
- 限制单日调用次数避免超额
- 对识别结果进行格式校验(如验证码是否为4位数字)
3.3 完整登录流程
from PIL import Imageimport timedef auto_login(driver, ocr_client, username, password):driver.get("https://example.com/login")# 填写基础信息driver.find_element_by_name("username").send_keys(username)driver.find_element_by_name("password").send_keys(password)# 定位验证码区域(根据实际页面调整)captcha_element = driver.find_element_by_id("captcha_img")location = captcha_element.locationsize = captcha_element.size# 截取验证码driver.save_screenshot("full_screen.png")left = location['x']top = location['y']right = left + size['width']bottom = top + size['height']img = Image.open("full_screen.png")captcha_img = img.crop((left, top, right, bottom))captcha_img.save("captcha.png")# 识别验证码captcha_text = ocr_client.recognize("captcha.png")if not captcha_text:raise Exception("验证码识别失败")# 提交表单driver.find_element_by_name("captcha").send_keys(captcha_text)driver.find_element_by_id("login_btn").click()# 验证登录结果time.sleep(2) # 等待页面跳转if "dashboard" not in driver.current_url:raise Exception("登录失败,请检查账号密码")
四、优化与扩展建议
4.1 验证码预处理
- 灰度化处理:
img.convert('L') - 二值化处理:
img.point(lambda x: 0 if x < 140 else 255) - 降噪处理:使用OpenCV进行形态学操作
4.2 异常处理机制
import tracebackdef safe_login():try:driver = init_browser()ocr = BaiduOCR("APP_ID", "API_KEY", "SECRET_KEY")auto_login(driver, ocr, "user", "pass")except Exception as e:print(f"登录失败: {str(e)}")traceback.print_exc()finally:if 'driver' in locals():driver.quit()
4.3 多线程与分布式
- 使用
concurrent.futures实现多账号并行登录 - 结合Redis管理验证码识别次数限制
- 容器化部署(Docker + Kubernetes)
五、常见问题解决方案
5.1 元素定位失败
- 使用XPath替代CSS选择器:
//input[@name='username'] - 添加显式等待:
```python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((“name”, “username”))
)
## 5.2 验证码识别率低- 收集错误样本进行针对性优化- 结合多种OCR引擎投票(如Tesseract+百度OCR)- 对特殊字体验证码进行模板匹配## 5.3 反爬虫机制应对- 随机User-Agent轮换- 代理IP池使用- 行为轨迹模拟(鼠标移动、输入停顿)- Cookie持久化管理# 六、完整示例代码```python# 完整实现包含错误处理、日志记录等模块# 实际使用时需替换以下参数BAIDU_APP_ID = "your_app_id"BAIDU_API_KEY = "your_api_key"BAIDU_SECRET_KEY = "your_secret_key"LOGIN_URL = "https://target-site.com/login"USERNAME = "test_user"PASSWORD = "secure_password"def main():# 初始化组件browser = init_browser()ocr = BaiduOCR(BAIDU_APP_ID, BAIDU_API_KEY, BAIDU_SECRET_KEY)try:# 执行登录流程browser.get(LOGIN_URL)# ...(省略重复代码,参考3.3节)print("登录成功!")except Exception as e:print(f"发生错误: {e}")finally:browser.quit()if __name__ == "__main__":main()
七、进阶应用方向
- 滑动验证码破解:结合OpenCV进行滑块轨迹计算
- 行为验证码识别:使用深度学习模型处理点选验证码
- 无头浏览器优化:通过CDP协议控制浏览器行为
- AI训练平台集成:将识别失败案例反馈至训练系统
本文提供的方案已在多个项目中验证,在保证合规性的前提下,可显著提升自动化测试效率。实际使用时需遵守目标网站的Robots协议及相关法律法规,建议仅用于内部系统测试或授权场景。

发表评论
登录后可评论,请前往 登录 或 注册