🎯 專案概述
這是一個基於 Selenium WebDriver 的網頁自動化技術學習專案。透過這個專案,我深入學習了現代網頁自動化技術,掌握了瀏覽器控制、元素定位、事件處理等核心技能。
注意: 本專案僅用於技術學習和研究目的,不提供完整程式碼開源。
🛠️ 技術架構
核心技術棧
- Python 3.9+ - 主要開發語言
- Selenium WebDriver - 瀏覽器自動化框架
- ChromeDriver - Chrome瀏覽器驅動
- BeautifulSoup4 - HTML解析
- 手動驗證碼處理 - 人工輸入驗證碼
系統架構設計
┌─────────────────┐
│ 配置管理模組 │
│ - 設定檔讀取 │
│ - 參數驗證 │
└─────────────────┘
│
▼
┌─────────────────┐
│ 瀏覽器控制模組 │
│ - WebDriver │
│ - 頁面載入 │
└─────────────────┘
│
▼
┌─────────────────┐
│ 元素定位模組 │
│ - XPath/CSS │
│ - 元素等待 │
└─────────────────┘
│
▼
┌─────────────────┐
│ 事件處理模組 │
│ - 點擊事件 │
│ - 表單填寫 │
└─────────────────┘
│
▼
┌─────────────────┐
│ 驗證處理模組 │
│ - 手動輸入 │
│ - 安全驗證 │
└─────────────────┘
│
▼
┌─────────────────┐
│ 日誌記錄模組 │
│ - 操作記錄 │
│ - 錯誤處理 │
└─────────────────┘
📚 學習重點
1. Selenium WebDriver 基礎
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 瀏覽器初始化
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 配置Chrome選項
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# 初始化WebDriver
driver = webdriver.Chrome(service=Service(chromedriver_path), options=chrome_options)
|
2. 元素定位技巧詳解
2.1 ID 定位(最優先使用)
1
2
3
4
5
6
7
8
9
| # 優點:唯一性高,定位速度快
# 適用:有明確ID的元素
element = driver.find_element(By.ID, "username")
element = driver.find_element(By.ID, "submit-button")
# 實際範例:登入表單
username_input = driver.find_element(By.ID, "login-username")
password_input = driver.find_element(By.ID, "login-password")
login_button = driver.find_element(By.ID, "login-submit")
|
2.2 Name 定位
1
2
3
4
5
6
7
8
| # 優點:語義化,易於理解
# 適用:表單元素
element = driver.find_element(By.NAME, "username")
element = driver.find_element(By.NAME, "email")
# 實際範例:搜尋框
search_input = driver.find_element(By.NAME, "q")
search_button = driver.find_element(By.NAME, "search")
|
2.3 Class Name 定位
1
2
3
4
5
6
7
8
| # 優點:可定位多個相同樣式的元素
# 適用:樣式化的元素
elements = driver.find_elements(By.CLASS_NAME, "btn-primary")
element = driver.find_element(By.CLASS_NAME, "form-control")
# 實際範例:按鈕群組
primary_buttons = driver.find_elements(By.CLASS_NAME, "btn-primary")
secondary_buttons = driver.find_elements(By.CLASS_NAME, "btn-secondary")
|
2.4 Tag Name 定位
1
2
3
4
5
6
7
8
9
| # 優點:可定位所有特定標籤
# 適用:需要遍歷所有同類元素
links = driver.find_elements(By.TAG_NAME, "a")
inputs = driver.find_elements(By.TAG_NAME, "input")
# 實際範例:獲取所有連結
all_links = driver.find_elements(By.TAG_NAME, "a")
for link in all_links:
print(link.text)
|
2.5 CSS Selector 定位(推薦)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 優點:語法簡潔,功能強大
# 適用:複雜的選擇器需求
# 基本選擇器
element = driver.find_element(By.CSS_SELECTOR, "input[type='text']")
element = driver.find_element(By.CSS_SELECTOR, ".btn-primary")
# 組合選擇器
element = driver.find_element(By.CSS_SELECTOR, "form.login-form input[type='submit']")
element = driver.find_element(By.CSS_SELECTOR, "div.container > button.btn")
# 實際範例:複雜表單
username = driver.find_element(By.CSS_SELECTOR, "form#loginForm input[name='username']")
password = driver.find_element(By.CSS_SELECTOR, "form#loginForm input[type='password']")
submit = driver.find_element(By.CSS_SELECTOR, "form#loginForm button[type='submit']")
|
2.6 XPath 定位(最靈活)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 優點:功能最強大,可定位任何元素
# 適用:複雜的定位需求
# 絕對路徑
element = driver.find_element(By.XPATH, "/html/body/div[1]/form/input[1]")
# 相對路徑
element = driver.find_element(By.XPATH, "//input[@name='username']")
element = driver.find_element(By.XPATH, "//button[contains(text(),'登入')]")
# 父元素定位
element = driver.find_element(By.XPATH, "//input[@id='username']/parent::div")
# 實際範例:動態內容定位
# 定位包含特定文字的按鈕
login_button = driver.find_element(By.XPATH, "//button[contains(text(),'登入')]")
# 定位特定屬性的元素
email_input = driver.find_element(By.XPATH, "//input[@type='email']")
# 定位多個條件
submit_btn = driver.find_element(By.XPATH, "//button[@type='submit' and @class='btn-primary']")
|
2.7 定位策略總結
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| # 推薦的定位優先順序
def find_element_smart(driver, element_info):
"""
智能元素定位策略
1. ID (最快)
2. Name (表單元素)
3. CSS Selector (複雜選擇)
4. XPath (最後選擇)
"""
try:
# 優先使用ID
if 'id' in element_info:
return driver.find_element(By.ID, element_info['id'])
except:
pass
try:
# 其次使用Name
if 'name' in element_info:
return driver.find_element(By.NAME, element_info['name'])
except:
pass
try:
# 使用CSS Selector
if 'css' in element_info:
return driver.find_element(By.CSS_SELECTOR, element_info['css'])
except:
pass
# 最後使用XPath
if 'xpath' in element_info:
return driver.find_element(By.XPATH, element_info['xpath'])
raise Exception("Element not found")
# 使用範例
element_info = {
'id': 'username',
'name': 'username',
'css': 'input[name="username"]',
'xpath': '//input[@name="username"]'
}
username_input = find_element_smart(driver, element_info)
|
3. 事件處理
1
2
3
4
5
6
7
8
9
10
11
| # 點擊操作
element.click()
# 輸入文字
element.clear()
element.send_keys("text")
# 下拉選單處理
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.ID, "dropdown"))
select.select_by_value("option_value")
|
4. 驗證碼處理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| # 手動輸入驗證碼
def handle_captcha_manual(driver):
"""
手動處理驗證碼
1. 截圖驗證碼區域
2. 暫停程式等待人工輸入
3. 輸入驗證碼並提交
"""
# 定位驗證碼輸入框
captcha_input = driver.find_element(By.ID, "captcha-input")
# 暫停等待人工輸入
print("請查看驗證碼並手動輸入...")
input("按Enter繼續...")
# 獲取人工輸入的驗證碼
captcha_text = input("請輸入驗證碼: ")
# 輸入驗證碼
captcha_input.clear()
captcha_input.send_keys(captcha_text)
return captcha_text
# 使用範例
captcha_result = handle_captcha_manual(driver)
print(f"驗證碼已輸入: {captcha_result}")
|
自動辨識驗證碼技術:如需了解更多關於自動驗證碼辨識技術,請聯絡 Boyce Work工作坊 了解更多。
🎨 專案特色
模組化設計
- 配置管理:外部設定檔,易於調整參數
- 錯誤處理:完善的異常處理機制
- 日誌記錄:詳細的操作記錄和錯誤追蹤
- 重試機制:智能重試,提高成功率
技術亮點
- 智能等待:動態等待頁面元素載入
- 元素驗證:多重驗證確保操作準確性
- 性能優化:最小化瀏覽器資源佔用
- 跨平台支援:Windows/Linux/macOS相容
🔧 開發心得
技術挑戰
- 動態元素處理:頁面元素動態載入的處理
- 驗證機制處理:手動驗證碼輸入的流程設計
- 性能優化:在速度與穩定性間找到平衡
- 錯誤恢復:網路異常時的智能恢復
學習收穫
- 深入理解Web自動化技術
- 掌握瀏覽器控制原理
- 提升Python程式設計能力
- 學會模組化系統設計
🚀 技術應用
可擴展的應用場景
- 資料爬取:自動化資料收集
- 表單填寫:批量表單處理
- 網站測試:自動化測試腳本
- 監控系統:網站狀態監控
進階技術方向
- 機器學習整合:AI輔助驗證碼識別
- 分散式架構:多執行緒並行處理
- 雲端部署:容器化部署方案
- API設計:RESTful API介面
⚠️ 重要聲明
本專案僅用於技術學習目的
- 不提供完整程式碼開源
- 不鼓勵用於商業用途
- 請遵守相關網站的使用條款
- 建議在測試環境中學習技術
📖 學習資源
推薦學習路徑
- Selenium官方文檔:掌握基礎API
- Python自動化實戰:實際專案練習
- Web技術深入:HTML/CSS/JavaScript基礎
- 進階自動化:機器學習整合
相關技術
- Playwright:新一代自動化框架
- Puppeteer:Node.js自動化方案
- Appium:移動端自動化
- Robot Framework:測試自動化框架
🎯 結語
這個專案讓我深入學習了現代網頁自動化技術,從基礎的Selenium操作到複雜的驗證碼處理,每一步都是寶貴的學習經驗。
技術學習的價值不在於最終的成品,而在於過程中解決問題的能力提升。
“自動化不是為了取代人工,而是為了讓技術更好地服務人類。”
標籤: #Python #Selenium #自動化 #Web技術 #學習專案