selenium如何识别条形验证码,自动输入验证码

发布于:2025-06-28 ⋅ 阅读:(19) ⋅ 点赞:(0)

在自动化测试或网页爬取中,识别验证码是常见的难点。Selenium 本身不具备直接识别验证码的能力,但可以通过结合第三方工具、OCR 技术或人工介入等方式解决。以下是多种可行方案的详细实现思路及代码示例:

一、方案一:使用第三方验证码识别服务(最推荐)

原理

通过 API 将验证码图片发送给专业识别平台,平台返回识别结果,适用于复杂验证码(如扭曲文字、点选式等)。

常用平台
  • 打码平台:超级鹰、云打码、快识别等(需注册账号获取 API 密钥)。
  • AI 识别服务:Google Cloud Vision、百度 AI 开放平台、腾讯云 OCR 等(适合企业级应用)。
代码示例(以超级鹰为例)

python

运行

from selenium import webdriver
import requests
import base64
import time

# 1. 初始化浏览器
driver = webdriver.Chrome()
driver.get("需要验证码的网页URL")

# 2. 截取验证码图片
def get_captcha(driver, element_id):
    # 定位验证码元素并截图
    captcha_element = driver.find_element_by_id(element_id)
    captcha_element.screenshot("captcha.png")
    return "captcha.png"

# 3. 调用超级鹰API识别
def recognize_captcha(image_path, app_id, app_key, soft_id):
    # 读取图片并转base64
    with open(image_path, "rb") as f:
        image_data = base64.b64encode(f.read())
    
    # 构造请求参数
    url = "http://api.chaojiying.com/Upload/Processing.php"
    data = {
        "user": app_id,
        "pass2": app_key,
        "softid": soft_id,
        "codetype": "1004",  # 验证码类型,1004代表数字+英文
        "file": image_data
    }
    
    # 发送请求
    response = requests.post(url, data=data)
    return response.json()["pic_str"]  # 返回识别结果

# 4. 主流程
if __name__ == "__main__":
    # 超级鹰账号信息(需自行注册)
    APP_ID = "你的AppID"
    APP_KEY = "你的AppKey"
    SOFT_ID = "你的SoftID"
    
    # 截取验证码
    img_path = get_captcha(driver, "captcha_img")  # 假设验证码元素ID为captcha_img
    
    # 识别验证码
    captcha_text = recognize_captcha(img_path, APP_ID, APP_KEY, SOFT_ID)
    print("识别结果:", captcha_text)
    
    # 输入验证码并提交
    driver.find_element_by_id("captcha_input").send_keys(captcha_text)
    driver.find_element_by_id("submit_btn").click()
    
    time.sleep(3)
    driver.quit()

二、方案二:使用 OCR 库本地识别(适合简单验证码)

原理

通过 Python 的 OCR 库(如 Pillow、Tesseract)对图片进行文字识别,适合无干扰的纯文字验证码。如下面这个验证码:

实现步骤(1,2步骤可以参考文章selenium识别条形验证码,pytesseract下载、配置环境变量-CSDN博客
  1. 安装 Tesseract OCR 引擎(需下载本地安装包)
  2. 安装 Python 绑定库pytesseract
  3. 截图验证码并识别
代码示例

python

运行

from selenium import webdriver
from PIL import Image
import pytesseract
import time

# 1. 配置Tesseract路径(Windows需修改此处)
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# 2. 初始化浏览器
driver = webdriver.Chrome()
driver.get("http://example.com/captcha_page")  # 替换为实际网址

# 3. 截取验证码并识别
def recognize_captcha(driver, element_id):
    # 定位元素并截图
    captcha_element = driver.find_element_by_id(element_id)
    captcha_element.screenshot("captcha.png")
    
    # 打开图片并识别
    image = Image.open("captcha.png")
    # 可选:预处理图片(灰度化、去噪点)
    image = image.convert("L")  # 灰度化
    captcha_text = pytesseract.image_to_string(image, lang="eng+chi_sim")
    return captcha_text.strip()  # 去除空格和换行

# 4. 主流程
if __name__ == "__main__":
    # 假设验证码元素ID为captcha_img
    captcha_text = recognize_captcha(driver, "captcha_img")
    print("识别结果:", captcha_text)
    
    # 输入验证码
    driver.find_element_by_id("captcha_input").send_keys(captcha_text)
    driver.find_element_by_id("submit_btn").click()
    
    time.sleep(3)
    driver.quit()

三、方案三:人工介入(临时解决方案)

适用场景
  • 开发测试阶段,不想耗费时间集成识别服务
  • 验证码过于复杂(如滑动拼图、点选图标等)
代码实现

python

运行

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("需要验证码的网页")

# 1. 截图并提示人工输入
driver.save_screenshot("page_with_captcha.png")
print("请查看截图'page_with_captcha.png',并输入验证码:")
captcha_text = input()  # 等待用户手动输入

# 2. 提交验证码
driver.find_element_by_id("captcha_input").send_keys(captcha_text)
driver.find_element_by_id("submit_btn").click()

time.sleep(3)
driver.quit()

四、方案四:规避验证码(进阶技巧)

1. 使用 Cookie 绕过验证
  • 原理:提前登录并保存 Cookie,后续通过 Selenium 加载 Cookie 跳过验证码页面
  • 代码示例:

    python

    运行

    # 提前登录并获取Cookie(手动操作一次)
    driver.get("登录页")
    # 手动输入账号密码和验证码,登录成功后
    cookies = driver.get_cookies()
    # 保存Cookie到文件
    import json
    with open("cookies.json", "w") as f:
        json.dump(cookies, f)
    
    # 后续使用Cookie跳过验证
    driver.get("目标页")
    with open("cookies.json", "r") as f:
        cookies = json.load(f)
    for cookie in cookies:
        driver.add_cookie(cookie)
    driver.refresh()  # 刷新页面即可免登录
    
2. 模拟人类行为减少验证触发
  • 避免机械化操作(如设置随机延迟、模拟鼠标移动轨迹)
  • 示例:

    python

    运行

    import random
    # 随机延迟0.5-2秒
    time.sleep(random.uniform(0.5, 2))
    # 模拟鼠标移动(非直线点击)
    from selenium.webdriver import ActionChains
    element = driver.find_element_by_id("button")
    actions = ActionChains(driver)
    actions.move_to_element_with_offset(element, random.randint(-10, 10), random.randint(-10, 10))
    actions.click().perform()
    

五、各方案对比与选择建议

方案 优点 缺点 适用场景
第三方识别服务 准确率高,支持复杂验证码 需付费,依赖网络 生产环境、商业项目
本地 OCR 识别 免费,部署简单,新人学习 准确率低,需图片预处理 简单文字验证码、测试环境
人工介入 100% 准确,无需技术开发 无法自动化,效率低 临时任务、开发调试
规避验证码 高效,无需识别 需提前登录,适用性有限 已知可绕过的固定场景

六、验证码识别优化技巧

  1. 图片预处理
    • 灰度化、二值化处理(去除背景干扰)
    • 降噪点(使用 PIL 的filter(ImageFilter.MedianFilter)
  2. 指定识别语言
    • Tesseract 通过lang="eng"(英文)或lang="chi_sim"(简体中文)提高准确率
  3. 结合机器学习
    • 若验证码样式固定,可收集样本训练自定义 OCR 模型(如使用 TensorFlow 或 PyTorch)

通过以上方案,可根据验证码复杂度和项目需求选择合适的识别方式。对于生产环境,优先考虑第三方服务(如超级鹰)或企业级 AI 接口(如百度 OCR),以保证稳定性和准确率;测试阶段可先用人工介入或本地 OCR 快速验证流程。


网站公告

今日签到

点亮在社区的每一天
去签到