🔑 核心成功因素
1. 使用 Playwright 替代 Selenium
Playwright 是微軟開發的新一代自動化測試工具,具有更強的反檢測能力。相較於 Selenium,Playwright 在設計時就考慮了現代網頁應用的需求,提供了更穩定、更快速的執行效能。
from playwright.sync_api import sync_playwright
# 啟動 Playwright
playwright = sync_playwright().start()
browser = playwright.chromium.launch(headless=True)
2. 禁用自動化控制特徵
這是最關鍵的配置,能有效隱藏爬蟲特徵。透過禁用 Blink 引擎的自動化控制特徵,可以避免網站偵測到 navigator.webdriver 屬性。
browser = playwright.chromium.launch(
headless=True,
args=[
'--disable-blink-features=AutomationControlled', # 🔥 最關鍵
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage'
]
)
--disable-blink-features=AutomationControlled 參數可以防止網站偵測到 navigator.webdriver 屬性。這是繞過大多數反爬蟲機制的第一道防線。
3. 注入 Stealth 腳本
在頁面載入前修改 JavaScript 環境,偽造瀏覽器特徵。這些修改會在網站的檢測腳本執行前完成,使得網站無法分辨是真實使用者還是自動化程式。
context.add_init_script("""
// 隱藏 webdriver 屬性
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// 偽造 Chrome 物件
window.navigator.chrome = {
runtime: {},
};
// 偽造 Plugins
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5],
});
// 偽造 Languages
Object.defineProperty(navigator, 'languages', {
get: () => ['zh-TW', 'zh', 'en-US', 'en'],
});
""")
4. 完整的瀏覽器上下文配置
設定真實的瀏覽器環境參數,包括視窗大小、User-Agent、語言、時區等。這些參數應該與真實使用者的環境保持一致。
context = browser.new_context(
viewport={'width': 1920, 'height': 1080},
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
locale='zh-TW',
timezone_id='Asia/Taipei',
accept_downloads=True,
permissions=['geolocation']
)
5. 優雅的下載處理
使用 Playwright 的 expect_download() 方法,無需監控檔案系統。這個方法會自動等待下載完成,並提供下載物件供後續處理。
with page.expect_download(timeout=30000) as download_info:
btn.click()
download = download_info.value
download.save_as(target_path) # 直接保存