Python Playwright 零基础入门教程:从安装到实战(2026最新)

Playwright 是微软推出的新一代自动化测试/爬虫工具,相比传统的 Selenium,它原生支持异步、跨浏览器(Chrome/Firefox/Safari)、自动等待元素加载,还能轻松处理弹窗、验证码(基础)、动态渲染页面,成为Python开发者做UI自动化、网页数据爬取的首选工具。本文从零基础出发,手把手教你掌握Playwright的核心用法,避开新手常见坑。

一、Playwright 核心优势(为什么选它?)

作为一线开发和测试工程师,我对比过多款自动化工具,Playwright的优势特别贴合实际开发需求:

  1. 跨浏览器兼容:一次编写,可运行在Chrome、Firefox、Edge、Safari(包括移动端模拟器);
  2. 自动等待机制:无需手动加time.sleep(),会智能等待元素加载完成再操作,减少代码报错;
  3. 原生支持异步:基于asyncio,异步脚本效率比Selenium高30%以上;
  4. 功能全面:内置截图、录屏、网络拦截、本地存储操作等功能,无需额外插件;
  5. 调试友好:自带代码生成器,能录制操作并自动生成Python代码,新手也能快速上手。

二、环境安装(Windows/macOS/Linux通用)

1. 安装Playwright库

首先确保你的Python版本≥3.8(推荐3.9-3.11,兼容性最好),打开终端/命令提示符执行:

pip install playwright

2. 安装浏览器驱动

Playwright需要下载对应浏览器的驱动,执行以下命令自动安装(国内用户建议加清华镜像加速):

# 国内镜像版(推荐)
playwright install --driver-path https://mirrors.tuna.tsinghua.edu.cn/github-release/microsoft/playwright-cli/latest/
# 官方原版
playwright install

安装完成后,会自动下载Chrome、Firefox、WebKit(Safari内核)三款浏览器的驱动,无需手动配置环境变量。

新手踩坑提醒:

  • 如果提示“权限不足”,macOS/Linux加sudo,Windows以管理员身份运行终端;
  • 若下载超时,可手动到Playwright官网下载驱动,解压后放到Python安装目录的Scripts文件夹下。

三、第一个Playwright脚本:打开浏览器并访问网页

先写一个最简单的示例,验证环境是否正常,功能是:打开Chrome浏览器→访问百度→搜索“Python Playwright”→截图保存。

from playwright.sync_api import sync_playwright

# 同步模式(新手首选)
with sync_playwright() as p:
    # 启动Chrome浏览器,headless=False表示显示浏览器窗口(调试用)
    browser = p.chromium.launch(headless=False, slow_mo=500)  # slow_mo延迟500ms,方便看操作过程
    # 创建新页面
    page = browser.new_page()
    # 访问百度
    page.goto("https://www.baidu.com")
    # 定位搜索框,输入关键词(id定位,最常用)
    page.locator("#kw").fill("Python Playwright 教程")
    # 点击搜索按钮
    page.locator("#su").click()
    # 等待页面加载完成,截图保存
    page.wait_for_load_state("networkidle")  # 等待网络请求完成
    page.screenshot(path="baidu_search.png")
    # 关闭浏览器
    browser.close()
print("脚本执行完成,截图已保存!")

运行脚本后,会看到Chrome自动打开并完成操作,当前目录会生成baidu_search.png截图文件。

四、核心功能详解:从入门到进阶

1. 元素定位(Playwright的核心)

Playwright支持多种定位方式,比Selenium更灵活,常用的有:

定位方式 代码示例 适用场景
ID定位 page.locator("#kw") 元素有唯一ID
类名定位 page.locator(".s_ipt") 元素有特定class
文本定位 page.locator("text=百度一下") 按可见文本定位按钮/链接
XPath定位 page.locator("//input[@name='wd']") 复杂结构定位
CSS选择器 page.locator("input[name='wd']") 通用、高效的定位方式

实战技巧:用Playwright的代码生成器自动获取定位代码——终端执行:

playwright codegen https://www.baidu.com

会自动打开浏览器和代码生成面板,你手动操作的每一步,都会实时生成对应的Python代码,直接复制即可用!

2. 页面交互操作

常见的页面操作(点击、输入、下拉框选择、滚动)示例:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://www.baidu.com")
    
    # 1. 输入文本(清空原有内容再输入)
    page.locator("#kw").fill("Playwright 用法")
    
    # 2. 点击元素
    page.locator("#su").click()
    
    # 3. 滚动页面(向下滚动500像素)
    page.mouse.wheel(0, 500)
    
    # 4. 选择下拉框(以百度设置的下拉框为例)
    page.locator("#s-usersetting-top").click()  # 打开下拉菜单
    page.locator("text=搜索设置").click()       # 点击菜单选项
    
    # 5. 勾选复选框
    page.locator("input[type='checkbox'][name='ime']").check()
    
    browser.close()

3. 无头模式运行(生产环境推荐)

调试时用headless=False显示浏览器,生产环境建议开启无头模式(不显示窗口,速度更快):

# 无头模式启动Chrome
browser = p.chromium.launch(headless=True)  # 默认为True,可省略

4. 异步模式(提升效率)

如果需要同时操作多个页面/浏览器,推荐用异步模式,示例:

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto("https://www.baidu.com")
        await page.locator("#kw").fill("异步Playwright")
        await page.locator("#su").click()
        await page.wait_for_load_state("networkidle")
        await browser.close()

# 执行异步函数
asyncio.run(main())

五、实战案例:爬取动态渲染的网页数据

以爬取某资讯网站的文章列表为例(动态加载的内容,requests无法直接获取):

from playwright.sync_api import sync_playwright

def crawl_news():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        # 访问目标网站(示例用新浪新闻)
        page.goto("https://news.sina.com.cn/")
        
        # 等待文章列表加载完成
        page.wait_for_selector(".news-item")
        
        # 提取所有文章标题和链接
        news_list = page.locator(".news-item").all()
        for news in news_list:
            # 提取标题
            title = news.locator("h2 a").inner_text()
            # 提取链接
            link = news.locator("h2 a").get_attribute("href")
            print(f"标题:{title}\n链接:{link}\n---")
        
        browser.close()

if __name__ == "__main__":
    crawl_news()

运行后会输出所有文章的标题和链接,解决了动态渲染页面的爬取问题。

六、高级技巧:解决新手常见问题

1. 处理弹窗(alert/confirm/prompt)

Playwright能自动识别并处理弹窗,示例:

# 监听弹窗并自动确认
page.on("dialog", lambda dialog: dialog.accept())
# 若需要输入内容(prompt弹窗)
page.on("dialog", lambda dialog: dialog.accept("输入的内容"))

2. 网络拦截(过滤广告/请求)

拦截不需要的请求(如广告、图片),提升爬取速度:

# 拦截图片、视频请求
def block_request(route, request):
    if request.resource_type in ["image", "video", "stylesheet"]:
        route.abort()  # 终止请求
    else:
        route.continue_()  # 继续请求

# 注册拦截器
page.route("**/*", block_request)

3. 录屏功能(调试/留痕)

# 启动时开启录屏,保存为webm格式
browser = p.chromium.launch(headless=False)
context = browser.new_context(record_video_dir="./videos/")
page = context.new_page()
page.goto("https://www.baidu.com")
# 关闭时自动保存视频
context.close()
posted @ 2026-02-12 16:38  小帅记事  阅读(266)  评论(0)    收藏  举报