Playwright 教程高級篇:掌握網頁自動化與驗證碼處理等關鍵技術詳解
本教程將帶您一步步學習如何使用 Playwright——一個強大的瀏覽器自動化工具,來完成網頁任務,例如提交鏈接并處理旋轉驗證碼。我們將按照典型的自動化流程順序,從啟動瀏覽器到關閉瀏覽器,詳細講解每個步驟中用到的Playwright 技術,包括保存用戶會話、規避網站檢測、與用戶交互、操作網頁元素、截取圖像、模擬人類行為等。此外,我們還會探討如何處理iframe 和跨域問題,因為驗證碼常藏在這些復雜場景中。教程使用通用的術語和表達,確保無需特定代碼背景也能理解,適合任何網頁自動化項目。無論您是想自動化表單提交還是挑戰驗證碼,本教程都為您提供準確、實用的Playwright 技能。
自動化流程的逐步解析
自動化流程通常包括啟動瀏覽器、訪問網頁、確認用戶登錄、填寫表單、觸發驗證碼、解決驗證碼、驗證結果并清理資源。以下按此順序分解每個 Playwright 技術的應用,清晰說明其功能、用途和實現方法。
1. 啟動瀏覽器并保存會話數據
這是什么步驟? 啟動瀏覽器并配置一個存儲空間,用于保存登錄信息(如 cookies),以避免每次運行都需要重新登錄。
Playwright 如何實現? Playwright 支持通過持久化上下文啟動瀏覽器(例如 Chromium),將 cookies 和會話數據保存在本地文件夾中,區別于隱身模式(隱身模式關閉后清空數據)。
關鍵技術:
- 持久化上下文:使用 playwright.chromium.launch_persistent_context,指定一個存儲路徑(如 ./browser_data),保存 cookies、瀏覽器緩存等數據,供后續運行復用。
- 創建存儲目錄:通過 Python 的 os.path.exists 檢查存儲路徑是否存在,若不存在則用 os.makedirs 創建,確保程序順利運行。
- 顯示瀏覽器:設置 headless=False,讓瀏覽器可見,便于觀察操作或調試。
- 自定義瀏覽器路徑:通過 executable_path 指定特定的瀏覽器可執行文件,適用于需要特定版本的場景。
- 瀏覽器配置:
- 使用 --disable-infobars 參數隱藏瀏覽器頂部提示條(如“瀏覽器正被自動化控制”)。
- 移除 --enable-automation 參數,避免網站檢測到自動化行為。
- 設置真實的 user_agent(如模擬 Windows 上的 Chrome 瀏覽器),使瀏覽器行為更像普通用戶。
示例代碼:
from playwright.sync_api import sync_playwright
import oswith sync_playwright() as p:data_dir = "./browser_data"if not os.path.exists(data_dir):os.makedirs(data_dir)context = p.chromium.launch_persistent_context(user_data_dir=data_dir,headless=False,args=["--disable-infobars"],ignore_default_args=["--enable-automation"],user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0")
為什么重要? 保存會話數據就像給瀏覽器一個“記事本”,讓它記住登錄狀態,省去重復登錄的麻煩。合理的配置還能讓瀏覽器顯得更像真人操作,降低被網站攔截的風險。
如何應用? 啟動持久化上下文時,指定一個固定路徑存儲數據。設置 headless=False 便于測試,并調整瀏覽器參數以模擬正常用戶行為。這就像為瀏覽器準備一個舒適的家,存儲它的記憶。
2. 復用瀏覽器的默認頁面
這是什么步驟? 直接使用瀏覽器啟動時自帶的頁面(標簽頁),而不是額外打開新頁面。
Playwright 如何實現? 每次啟動瀏覽器上下文時,Playwright 自動創建一個頁面(類似于瀏覽器的一個標簽頁)。您可以直接使用這個默認頁面進行操作,保持簡潔高效。
關鍵技術:
- 訪問頁面:通過 context.pages 獲取所有打開的頁面列表,默認頁面通常是 pages[0]。
- 復用頁面:直接操作 context.pages[0],無需調用 context.new_page() 創建新頁面。
- 安全檢查:確認 context.pages 不為空,以防瀏覽器未正確初始化。
示例代碼:
if not context.pages:print("錯誤:未找到默認頁面!")exit()
page = context.pages[0]
print("正在使用默認頁面")
為什么重要? 復用默認頁面就像用桌面上已有的紙張寫字,無需再拿一張新的。節省資源的同時讓腳本邏輯更清晰。
如何應用? 啟動上下文后,取出 context.pages[0] 作為操作頁面,并在代碼中檢查其是否存在。僅在需要多任務并行時才創建新頁面。
3. 規避網站對自動化的檢測
這是什么步驟? 調整瀏覽器屬性,隱藏自動化腳本的痕跡,讓網站認為您是普通用戶。
Playwright 如何實現? Playwright 可以在瀏覽器中運行 JavaScript 代碼,修改特定屬性,結合啟動時的配置,偽裝成常規瀏覽器。
關鍵技術:
- 隱藏 Webdriver:通過 JavaScript 將 navigator.webdriver 設置為 undefined,因為普通瀏覽器無此屬性。
- 模擬瀏覽器環境:添加 window.chrome 等屬性,偽裝成 Chrome 瀏覽器。
- 偽造語言設置:將 navigator.languages 設置為常見值(如 [“zh-CN”, “zh”, “en”]),符合用戶習慣。
- 模擬插件:為 navigator.plugins 設置一個簡單的數組,假裝瀏覽器安裝了擴展。
- 運行 JavaScript:使用 page.evaluate 在瀏覽器中執行這些修改。
示例代碼:
page.evaluate("""Object.defineProperty(navigator, 'webdriver', {get: () => undefined});window.chrome = window.chrome || {};Object.defineProperty(navigator, 'languages', {get: () => ['zh-CN', 'zh', 'en']});Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3]});
""")
為什么重要? 許多網站會檢查瀏覽器屬性以識別自動化腳本。這些修改讓 Playwright 像一個普通用戶,順利通過檢測,就像穿上合適的衣服融入人群。
如何應用? 在頁面加載后,使用 page.