python:playwright事件监听、获取节点属性

from playwright.sync_api import sync_playwright


def on_response(response):
    print(f'Status {response.status}:{response.url}')

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.on('response',on_response)
    page.goto('https://spa6.scrape.center/')
    page.wait_for_load_state('networkidle')
    browser.close()

🔍 逐行解析

第1行:导入模块

from playwright.sync_api import sync_playwright
  • 导入 Playwright 的 同步 API 入口函数 sync_playwright
  • Playwright 支持同步(blocking)和异步(async/await)两种模式,这里使用的是同步方式,适合脚本式任务。

第4–5行:定义响应监听回调函数

def on_response(response):
    print(f'Statue {response.status}:{response.url}')
  • 定义一个名为 on_response 的函数,它将在每次页面发起网络请求并收到响应时被调用。
  • response 是一个 Response 对象,包含:
    • .status:HTTP 状态码(如 200、404)
    • .url:该响应对应的完整 URL
  • ⚠️ 注意:这里拼写错误 —— "Statue" 应为 "Status"(不影响运行,但属于笔误)。

✅ 功能:打印出所有加载资源(HTML、JS、CSS、XHR、图片等)的响应状态和 URL。


第7行:启动 Playwright 上下文

with sync_playwright() as p:
  • 使用 with 语句确保资源自动清理。
  • p 是 Playwright 实例,可用于启动浏览器(Chromium、Firefox、WebKit)。

第8行:启动 Chromium 浏览器

browser = p.chromium.launch(headless=False)
  • 启动 Chromium 浏览器(非无头模式,即会弹出可视化窗口)。
  • headless=False 表示以“有界面”方式运行,便于调试;若设为 True 则后台静默运行。

第9行:新建一个浏览器页面(标签页)

page = browser.new_page()
  • 创建一个新的空白页面(类似在浏览器中打开新标签页)。

第10行:注册响应事件监听器

page.on('response', on_response)
  • 为当前页面注册一个事件监听器。
  • 每当页面发出请求并收到服务器响应时,都会调用 on_response 函数。
  • 这是 Playwright 的事件驱动机制,常用于抓包、监控 API、拦截数据等。

第11行:导航到目标网站

page.goto('https://spa6.scrape.center/')
  • 让页面跳转到指定 URL。
  • Playwright 会等待主文档(HTML)加载完成(默认行为),但不会等待后续的 AJAX 或 JS 渲染。

第12行:等待网络空闲

page.wait_for_load_state('networkidle')
  • 显式等待页面进入 networkidle 状态。
  • 含义:在最近 500 毫秒内没有新的网络请求(或只有少量静态资源请求)。
  • 这对 SPA(单页应用)非常重要,因为数据通常通过后续 XHR/Fetch 请求加载,仅靠 goto 无法保证数据已就绪。

💡 networkidle 是抓取动态内容的关键步骤!


第13行:关闭浏览器

browser.close()
  • 关闭整个浏览器实例(包括所有页面和上下文)。
  • 释放系统资源。

page.on详解

page.on 是 Playwright 中用于监听页面事件(Page Events) 的核心方法。它的作用类似于浏览器中的 addEventListener,允许你在特定事件发生时执行自定义逻辑(例如记录日志、拦截请求、提取数据等)。


🔧 语法

page.on(event: str, callback: Callable)
  • event:要监听的事件名称(字符串),如 'request''response''load' 等。
  • callback:事件触发时调用的函数,接收一个参数(通常是 RequestResponse 或其他对象)。

📌 常见事件类型

事件名触发时机回调参数类型典型用途
'request'页面发起 HTTP 请求时Request 对象拦截/修改请求、记录请求 URL
'response'收到 HTTP 响应时Response 对象提取 API 数据、检查状态码
'load'页面主文档加载完成(window.onload无参数等待初始 HTML 加载
'domcontentloaded'DOM 构建完成(不等待图片/CSS)无参数快速操作 DOM
'popup'新窗口/标签页打开时Page 对象处理弹窗页面
'console'页面调用 console.log()ConsoleMessage 对象调试 JS 输出

🌰 核心示例:监听响应(你的代码场景)

def on_response(response):
    print(f"Status {response.status}: {response.url}")

page.on("response", on_response)  # 注册监听器
  • 每当页面收到一个 HTTP 响应(包括 HTML、JS、CSS、XHR、图片等),都会调用 on_response
  • 通过 response.urlresponse.status 可以分析网络行为。

截获Ajax请求:

from playwright.sync_api import sync_playwright


# def on_response(response):
#     print(f'Status {response.status}:{response.url}')

def on_response(response):
    if '/api/movie/' in response.url and response.status == 200:
        print(response.json())

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.on('response',on_response)
    page.goto('https://spa6.scrape.center/')
    page.wait_for_load_state('networkidle')
    browser.close()

⚠️ 注意事项

  1. 事件注册时机
    必须在 page.goto() 之前 注册监听器,否则可能错过早期请求:

    page.on("response", callback)  # ✅ 正确:先注册
    page.goto("https://example.com")

获取节点属性:

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://spa6.scrape.center/')
    page.wait_for_load_state('networkidle')
    href = page.get_attribute('a.name', 'href')
    print(href)
    browser.close()

运行结果如下:

  • 获取元素属性

    href = page.get_attribute('a.name', 'href')
    • 尝试获取第一个匹配选择器 'a.name'<a> 标签的 href 属性值。

posted @ 2025-12-29 11:18  chenlight  阅读(24)  评论(0)    收藏  举报  来源