在自動化測試或網頁爬取中,識別驗證碼是常見的難點。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):# 讀取圖片并轉base64with 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博客)
- 安裝 Tesseract OCR 引擎(需下載本地安裝包)
- 安裝 Python 綁定庫
pytesseract
- 截圖驗證碼并識別
代碼示例
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_imgcaptcha_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 timedriver = 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% 準確,無需技術開發 | 無法自動化,效率低 | 臨時任務、開發調試 |
規避驗證碼 | 高效,無需識別 | 需提前登錄,適用性有限 | 已知可繞過的固定場景 |
六、驗證碼識別優化技巧
- 圖片預處理:
- 灰度化、二值化處理(去除背景干擾)
- 降噪點(使用 PIL 的
filter(ImageFilter.MedianFilter)
)
- 指定識別語言:
- Tesseract 通過
lang="eng"
(英文)或lang="chi_sim"
(簡體中文)提高準確率
- Tesseract 通過
- 結合機器學習:
- 若驗證碼樣式固定,可收集樣本訓練自定義 OCR 模型(如使用 TensorFlow 或 PyTorch)
通過以上方案,可根據驗證碼復雜度和項目需求選擇合適的識別方式。對于生產環境,優先考慮第三方服務(如超級鷹)或企業級 AI 接口(如百度 OCR),以保證穩定性和準確率;測試階段可先用人工介入或本地 OCR 快速驗證流程。