【0基础学爬虫】爬虫基础之自动化工具 Playwright 的使用
字数 1354 2025-08-11 00:55:05
Playwright 自动化工具使用详解
一、Playwright 概述
Playwright 是一个由 Microsoft 开发的用于自动化 Web 浏览器测试和 Web 数据抓取的开源库。它支持 Chrome、Firefox、Safari、Edge 和 WebKit 浏览器,并能在 Windows、Linux 和 macOS 上运行。
主要优势:
- 兼容多个浏览器,所有浏览器使用相同的 API
- 速度快、稳定性高,适合大型复杂 Web 应用程序
- 支持无头浏览器模式
- 提供丰富的 API(截图、模拟输入、拦截网络请求等)
- 无需手动安装浏览器驱动
二、安装与初始化
安装要求
- Python 3.7 或更高版本
安装步骤
- 安装 Playwright 库:
pip install playwright
- 初始化安装所需浏览器:
playwright install
此命令会自动安装 Chromium、Firefox 和 WebKit 浏览器并配置驱动。
三、基本使用
同步模式
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 创建浏览器实例(关闭无头模式)
browser = p.chromium.launch(headless=False)
# 新建页面
page = browser.new_page()
# 导航到目标网址
page.goto("http://baidu.com")
# 获取页面截图
page.screenshot(path='example.png')
# 打印页面标题
print(page.title())
# 关闭浏览器
browser.close()
异步模式
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto("http://baidu.com")
# 打印网页源代码
print(await page.content())
await browser.close()
asyncio.run(main())
四、代码生成功能
Playwright 提供代码生成功能,可录制浏览器操作并生成代码。
使用命令:
playwright codegen -o script.py
常用参数:
-o:保存生成的脚本到指定文件--target:生成的语言(默认为 Python)-b:指定浏览器(chromium、firefox、webkit)--timeout:设置页面加载超时时间--user-agent:指定 User-Agent--viewport-size:指定浏览器窗口大小
五、隔离上下文
创建独立的全新上下文环境,防止多个测试用例并行时相互干扰:
browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()
六、元素定位
Playwright 提供多种定位器:
page.get_by_role():通过可访问性属性定位page.get_by_text():通过文本内容定位page.get_by_label():通过关联标签文本定位表单控件page.get_by_placeholder():按占位符定位输入page.get_by_alt_text():通过替代文本定位元素(通常是图像)page.get_by_title():通过标题属性定位元素page.get_by_test_id():根据 data-testid 属性定位page.locator():使用 CSS 或 XPath 选择器定位
七、选择器使用
CSS 选择器
page.locator('button').click() # 匹配 button 标签
page.locator('#container').click() # 根据 id 匹配
page.locator("button:visible").click() # 匹配可见的 button
page.locator(':has-text("Playwright")').click() # 匹配包含指定文本的节点
page.locator('article:has-text("products")').click()
page.locator("article:has(div.promo)").click()
XPath
page.locator("xpath=//button").click()
page.locator('xpath=//div[@class="container"]').click()
其他选择器
page.locator('text=name').click() # 匹配文本包含 name 的节点
page.locator("text='name'").click() # 匹配文本为 name 的节点
page.locator("text=/name\s\w+word").click() # 正则匹配
page.locator("button").locator("nth=0").click() # 匹配第一个 button
page.locator("button").locator("nth=-1").click() # 匹配最后一个 button
page.locator('id=name') # 匹配 id 为 name 的元素
八、等待机制
自动等待
Playwright 在执行操作前会自动检查元素可操作性:
- 元素是否附加到 DOM
- 元素是否可见
- 元素是否稳定(没有动画)
- 元素是否可接收事件
- 元素是否已启用
手动等待
page.wait_for_timeout(1000) # 固定等待1秒
page.wait_for_event(event) # 等待事件
page.get_by_role("button").click()
page.wait_for_load_state() # 等待加载状态
九、事件处理
添加/删除事件
from playwright.sync_api import sync_playwright
def print_request_sent(request):
print("Request sent: " + request.url)
def print_request_finished(request):
print("Request finished: " + request.url)
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 添加事件
page.on("request", print_request_sent)
page.on("requestfinished", print_request_finished)
page.goto("https://baidu.com")
# 删除事件
page.remove_listener("requestfinished", print_request_finished)
browser.close()
十、反检测策略
Playwright 默认容易被网站检测到,可通过以下方法绕过检测:
基本方法
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
# 添加自定义 User-Agent
page = browser.new_page(
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
)
# 执行隐藏特征的 JS 代码
with open('./stealth.min.js', 'r') as f:
js = f.read()
page.add_init_script(js)
page.goto("https://bot.sannysoft.com/")
page.screenshot(path='example.png')
browser.close()
推荐使用 stealth.min.js
该脚本可以隐藏大多数自动化工具特征,使其看起来像普通浏览器访问。
十一、总结
与 Selenium 相比,Playwright 的主要优势:
- 无需手动安装浏览器驱动
- 更好的性能和更多功能
- 更简洁的 API 设计
- 内置代码生成功能
- 更好的跨浏览器支持
对于爬虫开发,Playwright 是比 Selenium 更优的选择,特别是在需要处理复杂网页和反爬机制时。