【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 或更高版本

安装步骤

  1. 安装 Playwright 库:
pip install playwright
  1. 初始化安装所需浏览器:
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 提供多种定位器:

  1. page.get_by_role():通过可访问性属性定位
  2. page.get_by_text():通过文本内容定位
  3. page.get_by_label():通过关联标签文本定位表单控件
  4. page.get_by_placeholder():按占位符定位输入
  5. page.get_by_alt_text():通过替代文本定位元素(通常是图像)
  6. page.get_by_title():通过标题属性定位元素
  7. page.get_by_test_id():根据 data-testid 属性定位
  8. 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 的主要优势:

  1. 无需手动安装浏览器驱动
  2. 更好的性能和更多功能
  3. 更简洁的 API 设计
  4. 内置代码生成功能
  5. 更好的跨浏览器支持

对于爬虫开发,Playwright 是比 Selenium 更优的选择,特别是在需要处理复杂网页和反爬机制时。

Playwright 自动化工具使用详解 一、Playwright 概述 Playwright 是一个由 Microsoft 开发的用于自动化 Web 浏览器测试和 Web 数据抓取的开源库。它支持 Chrome、Firefox、Safari、Edge 和 WebKit 浏览器,并能在 Windows、Linux 和 macOS 上运行。 主要优势: 兼容多个浏览器,所有浏览器使用相同的 API 速度快、稳定性高,适合大型复杂 Web 应用程序 支持无头浏览器模式 提供丰富的 API(截图、模拟输入、拦截网络请求等) 无需手动安装浏览器驱动 二、安装与初始化 安装要求 Python 3.7 或更高版本 安装步骤 安装 Playwright 库: 初始化安装所需浏览器: 此命令会自动安装 Chromium、Firefox 和 WebKit 浏览器并配置驱动。 三、基本使用 同步模式 异步模式 四、代码生成功能 Playwright 提供代码生成功能,可录制浏览器操作并生成代码。 使用命令: 常用参数: -o :保存生成的脚本到指定文件 --target :生成的语言(默认为 Python) -b :指定浏览器(chromium、firefox、webkit) --timeout :设置页面加载超时时间 --user-agent :指定 User-Agent --viewport-size :指定浏览器窗口大小 五、隔离上下文 创建独立的全新上下文环境,防止多个测试用例并行时相互干扰: 六、元素定位 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 选择器 XPath 其他选择器 八、等待机制 自动等待 Playwright 在执行操作前会自动检查元素可操作性: 元素是否附加到 DOM 元素是否可见 元素是否稳定(没有动画) 元素是否可接收事件 元素是否已启用 手动等待 九、事件处理 添加/删除事件 十、反检测策略 Playwright 默认容易被网站检测到,可通过以下方法绕过检测: 基本方法 推荐使用 stealth.min.js 该脚本可以隐藏大多数自动化工具特征,使其看起来像普通浏览器访问。 十一、总结 与 Selenium 相比,Playwright 的主要优势: 无需手动安装浏览器驱动 更好的性能和更多功能 更简洁的 API 设计 内置代码生成功能 更好的跨浏览器支持 对于爬虫开发,Playwright 是比 Selenium 更优的选择,特别是在需要处理复杂网页和反爬机制时。