kp-013

浏览器自动化:Playwright 与 Selenium

核心 ≈ 30 分钟 PlaywrightSelenium无头浏览器自动化等待

前置知识

本文基于模型知识整理,建议核对官方文档(见 参考资料)。

一句话定义

Playwright/Selenium 用程序驱动真实浏览器内核完成「打开页面、等待渲染、定位元素、提取数据」,是接口不可得时采集 CSR 站点的兜底手段。

为什么重要

它把「人点浏览器」完整复刻成代码,能处理登录、点击、滚动加载等交互;但它慢且重——正确用法是把它当数据获取的跳板,而非全程跑在 DOM 操作上。

前置知识

kp-012(已确认必须渲染才能拿数据)。

核心概念

  • 无头模式:不显示窗口运行内核,节省资源。
  • 自动等待:Playwright 的 locator 操作内置等待元素可见可交互,替代手写 sleep。
  • 网络监听:page.on("response") / route 可拦截页面发出的 XHR 响应——比解析 DOM 更快更稳。
  • 资源拦截:屏蔽图片/字体/媒体可提速 2–5 倍。
  • 上下文复用:storage_state 导出/导入登录态,避免每次现场登录。

原理与机制

Playwright 最小可用模板(Python 同步 API):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    ctx = browser.new_context(user_agent=UA, viewport={"width": 1280, "height": 800})
    page = ctx.new_page()

    rows = []                                    # ① 监听网络响应优先于抓 DOM
    def on_response(resp):
        if "api/list" in resp.url:
            rows.extend(resp.json().get("data", []))
    page.on("response", on_response)

    page.goto("https://quotes.toscrape.com/js/", timeout=30000)
    page.wait_for_load_state("networkidle")      # ② 等网络空闲而非固定 sleep
    print(len(rows))

    html = page.content()                        # ③ 渲染后 HTML 交给 BS4 亦可
    browser.close()

性能三板斧(按收益排序):网络监听拿 JSON > 拦截无关资源 > 渲染后取 HTML 复用静态解析。滚动加载场景用 page.mouse.wheel 或 locator.scroll_into_view_if_needed 循环触发,直到出现终止标志。

实例或案例

quotes.toscrape.com/login 需要表单登录:Playwright fill 用户名密码 + click 提交,随后 ctx.storage_state(path="auth.json") 保存会话;下次 new_context(storage_state="auth.json") 直接带着登录态启动,省去重复登录(也降低触发风控的次数)。

常见误区

  • 误区一:time.sleep(3) 硬等待。 网络快则白等、慢则没等到;用 wait_for_load_state("networkidle")、wait_for_selector 或 locator 自动等待。
  • 误区二:全程 DOM 定位读文本。 能拿到 JSON 响应就不要解析渲染后的 DOM——监听响应天然结构化且抗改版。
  • 误区三:不关浏览器不留状态。 异常退出泄漏内核进程;用 with/try-finally 确保关闭,登录态统一走 storage_state。

自测题

  1. 为什么「监听网络响应」优于「读取渲染后 DOM」?

答:JSON 已结构化、字段稳定、无需等待特定元素,站点改版 DOM 时接口往往仍在。

  1. networkidle 相比固定 sleep 的优势?

答:以「网络请求静止」为信号,自适应快慢网络;sleep 要么浪费要么不足。

  1. 无头模式下提速的前两个手段?

答:拦截图片/字体等无关资源;改用响应监听减少 DOM 依赖。

与其他知识点的关系

kp-014 解释了监听到的请求从哪来;kp-035 的指纹对抗建立在能控制浏览器行为之上;kp-022 的云原生部署运行无头集群。

延伸阅读

Playwright Python 官方文档「Authentication」「Network」两节。

相关知识点

学习进度