Playwright 浏览器自动化技能
📋 技能概述
Playwright 是微软开发的现代化浏览器自动化库,比 Selenium 更快、更可靠。
🆚 Playwright vs Selenium
| 特性 | Playwright | Selenium |
|---|---|---|
| 速度 | ⚡ 快 | 🐢 较慢 |
| 自动等待 | ✅ 内置 | ❌ 需要手动 |
| 多浏览器 | ✅ Chromium/Firefox/WebKit | ✅ 所有主流浏览器 |
| 网络拦截 | ✅ 支持 | ❌ 有限 |
| 截图 | ✅ 全页截图 | ❌ 仅视口 |
| API 设计 | ✅ 现代化 | ⚠️ 传统 |
🛠️ 安装
# 安装 Python 库
pip3 install playwright --break-system-packages
# 安装浏览器
python3 -m playwright install chromium
🚀 快速开始
基础示例
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 启动浏览器
browser = p.chromium.launch(headless=True)
page = browser.new_page()
# 访问网页
page.goto('https://www.baidu.com')
# 截图
page.screenshot(path='example.png')
browser.close()
搜索示例
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
# 直接访问搜索 URL
page.goto('https://www.baidu.com/s?wd=Python', wait_until='networkidle')
# 获取搜索结果
results = page.query_selector_all('.result h3')
for i, r in enumerate(results[:5], 1):
print(f"{i}. {r.inner_text()}")
browser.close()
高级功能
1. 全页截图
page.screenshot(path='full.png', full_page=True)
2. 网络拦截
# 阻止图片加载
def block_images(route):
if route.request.resource_type == "image":
route.abort()
else:
route.continue_()
page.route("**/*", block_images)
page.goto("https://example.com")
3. 等待元素
# 自动等待元素可见
page.wait_for_selector('#my-element')
# 等待特定状态
page.wait_for_selector('.loaded', state='visible')
4. 表单操作
# 填写表单
page.fill('#username', 'user123')
page.fill('#password', 'pass456')
page.click('#login-btn')
# 等待跳转
page.wait_for_url('**/dashboard')
5. 多标签页
# 创建新标签
page = browser.new_page()
# 切换标签
pages = browser.pages
pages[0].bring_to_front()
📚 常用 API
页面导航
page.goto('https://example.com')
page.reload()
page.go_back()
page.go_forward()
元素操作
# 点击
page.click('#button')
# 输入
page.fill('#input', 'text')
page.type('#input', 'text', delay=100) # 模拟键盘
# 选择
page.select_option('#select', 'value')
page.check('#checkbox')
page.uncheck('#checkbox')
获取内容
# 文本
text = page.inner_text('#element')
html = page.inner_html('#element')
# 属性
href = page.get_attribute('a', 'href')
value = page.input_value('#input')
# 数量
count = page.count('.items')
截图和 PDF
# 截图
page.screenshot(path='page.png')
page.screenshot(path='full.png', full_page=True)
# PDF (仅 Chromium)
page.pdf(path='page.pdf')
⚠️ 常见问题
问题 1: 元素不可见
解决: 使用 wait_for_selector
page.wait_for_selector('#element', state='visible')
page.click('#element')
问题 2: 页面加载慢
解决: 使用 networkidle
page.goto('https://example.com', wait_until='networkidle')
问题 3: 反爬虫
解决: 设置 User-Agent 和隐藏自动化特征
browser = p.chromium.launch(
headless=True,
args=['--disable-blink-features=AutomationControlled']
)
page.set_extra_http_headers({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'
})
🎯 最佳实践
- 使用
with语句: 自动清理资源 - 启用 headless 模式: 节省资源
- 使用
networkidle: 确保页面完全加载 - 合理等待: 避免固定
sleep - 错误处理: 使用
try-except
📦 依赖
playwright>=1.40.0
🔗 相关资源
🔄 从 Selenium 迁移
如果你之前使用 Selenium,迁移非常简单:
# Selenium 代码
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://example.com')
element = driver.find_element(By.ID, 'my-element')
# Playwright 等价代码
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
element = page.locator('#my-element')
主要差异:
- Playwright 使用
page而不是driver - 自动等待,不需要
WebDriverWait - 选择器更强大 (支持 CSS/XPath/text)
locator替代find_element
版本: v1.1
创建时间: 2026-03-14 02:00 AM
更新: 2026-03-14 08:07 AM (添加迁移指南)
作者: Han's AI Assistant