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:事件触发时调用的函数,接收一个参数(通常是Request、Response或其他对象)。
📌 常见事件类型
| 事件名 | 触发时机 | 回调参数类型 | 典型用途 |
|---|---|---|---|
'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.url和response.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()
⚠️ 注意事项
-
事件注册时机
必须在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属性值。
- 尝试获取第一个匹配选择器

浙公网安备 33010602011771号