Playwright异步模式必须用async_playwright()启动,所有操作需在async with块内await调用;等待JS渲染应基于DOM状态、JS变量或网络请求,而非硬等待;并发需独立page实例,数据提取应直接读渲染后DOM。

Playwright 异步模式必须用 async_playwright() 启动
直接在 async 函数里 await page.goto() 会报 RuntimeError: await was used with a function that was not async——因为默认的 playwright API 是同步封装的,不是协程。不换入口,所有 await 都会失败。
- 必须用
from playwright.async_api import async_playwright,不能用sync_playwright -
browser、context、page全部要在async with async_playwright() as p:块内创建 - 所有操作如
page.goto、page.inner_text、page.click才真正变成可await的协程
等待 JS 渲染不能靠 page.wait_for_timeout()
硬等 2 秒或 5 秒既不可靠又拖慢并发吞吐:网速快时浪费,慢时超时取不到内容。JS 渲染完成必须绑定到可观测信号。
- 优先用
page.wait_for_selector("div.content", state="visible"),等关键节点真实出现在 DOM 且可见 - 若页面 JS 显式标记加载完成(如
window.dataReady = true),用page.wait_for_function("() => window.dataReady === true") - 数据由接口填充时,用
page.wait_for_response(lambda r: "api/list" in r.url)等特定请求返回 - 所有 wait 方法默认超时 30 秒,建议显式加
timeout=10000,避免卡死整个协程任务
并发爬取必须为每个任务分配独立 page 实例
多个 asyncio.create_task() 共享同一个 page 对象会导致状态错乱:Target closed、元素找不到、甚至返回上一个任务的 DOM 快照。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 不要复用
page;每个任务应走完整生命周期:context.new_page()→ 操作 →page.close() - 高并发下推荐按需创建
context,而非只建一个 context 复用多个 page(context 本身有资源开销,但比 page 共享安全) -
page.content()不可靠——它返回的是当前 DOM 序列化结果,但可能包含未渲染完的占位节点;应直接用page.inner_text()或page.query_selector().inner_text()
Selenium 的 driver.get() 在异步环境里根本不能用
Selenium 的 WebDriver API 完全基于同步阻塞设计,没有协程支持。强行把它塞进 async def 里,不仅无法提升并发,还会因线程锁和事件循环冲突导致随机崩溃或挂起。
立即学习“Python免费学习笔记(深入)”;
- 想异步 + 浏览器自动化?只有 Playwright(或 Pyppeteer)原生支持 asyncio
- 如果已有 Selenium 代码,别试图用
loop.run_in_executor包装——开销大、难调试、容易泄露 driver 实例 - 真正需要异步并发抓 JS 渲染页,就放弃 Selenium,改用 Playwright;Selenium 只适合单任务、低频、重交互场景(如填表、滑块)
chromium 缺失或 /tmp 目录无执行权限而卡在 launch()。务必提前运行 playwright install chromium,并确认 chmod +x 相关二进制文件。

















