logo

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 系统架构设计

整体流程分为三步:

  1. Selenium定位登录页面并填写用户名/密码
  2. 截取验证码图片区域并保存
  3. 调用百度OCR接口解析验证码文本
  4. 将识别结果填入输入框并提交表单

二、环境配置与依赖安装

2.1 基础环境要求

  • Python 3.6+
  • Chrome浏览器(建议v86+)
  • 对应版本的ChromeDriver
  • 百度AI开放平台账号(免费获取API Key)

2.2 依赖库安装

  1. pip install selenium pillow requests baidu-aip

关键库说明:

  • selenium: 浏览器自动化核心
  • Pillow: 图像处理(验证码截取与预处理)
  • requests: HTTP请求(调用百度OCR API)
  • baidu-aip: 百度AI官方SDK(可选)

2.3 百度OCR配置

  1. 登录百度AI开放平台创建应用
  2. 获取API Key和Secret Key
  3. 启用”通用文字识别”服务(免费版每日500次调用)

三、核心代码实现

3.1 浏览器初始化

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.options import Options
  3. def init_browser():
  4. chrome_options = Options()
  5. chrome_options.add_argument("--disable-infobars") # 禁用提示条
  6. chrome_options.add_argument("--start-maximized") # 最大化窗口
  7. driver = webdriver.Chrome(options=chrome_options)
  8. return driver

关键参数说明:

  • --headless: 无头模式(生产环境推荐)
  • --disable-gpu: 禁用GPU加速(避免兼容问题)
  • --no-sandbox: 在Docker环境中使用

3.2 验证码识别模块

  1. from aip import AipOcr
  2. import base64
  3. class BaiduOCR:
  4. def __init__(self, app_id, api_key, secret_key):
  5. self.client = AipOcr(app_id, api_key, secret_key)
  6. def recognize(self, image_path):
  7. with open(image_path, 'rb') as f:
  8. image = base64.b64encode(f.read())
  9. result = self.client.basicGeneral(image)
  10. if result and 'words_result' in result:
  11. return result['words_result'][0]['words']
  12. return None

异常处理建议:

  • 添加重试机制(网络波动可能导致失败)
  • 限制单日调用次数避免超额
  • 对识别结果进行格式校验(如验证码是否为4位数字)

3.3 完整登录流程

  1. from PIL import Image
  2. import time
  3. def auto_login(driver, ocr_client, username, password):
  4. driver.get("https://example.com/login")
  5. # 填写基础信息
  6. driver.find_element_by_name("username").send_keys(username)
  7. driver.find_element_by_name("password").send_keys(password)
  8. # 定位验证码区域(根据实际页面调整)
  9. captcha_element = driver.find_element_by_id("captcha_img")
  10. location = captcha_element.location
  11. size = captcha_element.size
  12. # 截取验证码
  13. driver.save_screenshot("full_screen.png")
  14. left = location['x']
  15. top = location['y']
  16. right = left + size['width']
  17. bottom = top + size['height']
  18. img = Image.open("full_screen.png")
  19. captcha_img = img.crop((left, top, right, bottom))
  20. captcha_img.save("captcha.png")
  21. # 识别验证码
  22. captcha_text = ocr_client.recognize("captcha.png")
  23. if not captcha_text:
  24. raise Exception("验证码识别失败")
  25. # 提交表单
  26. driver.find_element_by_name("captcha").send_keys(captcha_text)
  27. driver.find_element_by_id("login_btn").click()
  28. # 验证登录结果
  29. time.sleep(2) # 等待页面跳转
  30. if "dashboard" not in driver.current_url:
  31. raise Exception("登录失败,请检查账号密码")

四、优化与扩展建议

4.1 验证码预处理

  • 灰度化处理:img.convert('L')
  • 二值化处理:img.point(lambda x: 0 if x < 140 else 255)
  • 降噪处理:使用OpenCV进行形态学操作

4.2 异常处理机制

  1. import traceback
  2. def safe_login():
  3. try:
  4. driver = init_browser()
  5. ocr = BaiduOCR("APP_ID", "API_KEY", "SECRET_KEY")
  6. auto_login(driver, ocr, "user", "pass")
  7. except Exception as e:
  8. print(f"登录失败: {str(e)}")
  9. traceback.print_exc()
  10. finally:
  11. if 'driver' in locals():
  12. 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”))
)

  1. ## 5.2 验证码识别率低
  2. - 收集错误样本进行针对性优化
  3. - 结合多种OCR引擎投票(如Tesseract+百度OCR
  4. - 对特殊字体验证码进行模板匹配
  5. ## 5.3 反爬虫机制应对
  6. - 随机User-Agent轮换
  7. - 代理IP池使用
  8. - 行为轨迹模拟(鼠标移动、输入停顿)
  9. - Cookie持久化管理
  10. # 六、完整示例代码
  11. ```python
  12. # 完整实现包含错误处理、日志记录等模块
  13. # 实际使用时需替换以下参数
  14. BAIDU_APP_ID = "your_app_id"
  15. BAIDU_API_KEY = "your_api_key"
  16. BAIDU_SECRET_KEY = "your_secret_key"
  17. LOGIN_URL = "https://target-site.com/login"
  18. USERNAME = "test_user"
  19. PASSWORD = "secure_password"
  20. def main():
  21. # 初始化组件
  22. browser = init_browser()
  23. ocr = BaiduOCR(BAIDU_APP_ID, BAIDU_API_KEY, BAIDU_SECRET_KEY)
  24. try:
  25. # 执行登录流程
  26. browser.get(LOGIN_URL)
  27. # ...(省略重复代码,参考3.3节)
  28. print("登录成功!")
  29. except Exception as e:
  30. print(f"发生错误: {e}")
  31. finally:
  32. browser.quit()
  33. if __name__ == "__main__":
  34. main()

七、进阶应用方向

  1. 滑动验证码破解:结合OpenCV进行滑块轨迹计算
  2. 行为验证码识别:使用深度学习模型处理点选验证码
  3. 无头浏览器优化:通过CDP协议控制浏览器行为
  4. AI训练平台集成:将识别失败案例反馈至训练系统

本文提供的方案已在多个项目中验证,在保证合规性的前提下,可显著提升自动化测试效率。实际使用时需遵守目标网站的Robots协议及相关法律法规,建议仅用于内部系统测试或授权场景。

相关文章推荐

发表评论

活动