Python爬虫怎么用Playwright_比Selenium更快的现代浏览器自动化框架实战

2次阅读

playwright 启动浏览器卡在 install 是因未预先下载浏览器二进制。必须先执行 playwright install chromium(或 firefox/webkit),否则 launch 会超时;ci/cd 需确保安装在 pip install playwright 之后,windows 权限问题可加 –with-deps 参数解决。

Python爬虫怎么用Playwright_比Selenium更快的现代浏览器自动化框架实战

Playwright 启动浏览器为什么卡在 playwright install

Playwright 不像 Selenium 那样依赖系统已装的浏览器,它默认自带 Chromium、Firefox 和 WebKit 二进制,但首次运行时必须显式下载——很多人直接跑 playwright.launch() 报错,其实只是漏了这步。

常见错误现象:playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.BrowserType.connect_over_cdp: Failed to connect,本质是浏览器没装,不是网络或代理问题。

  • 必须先执行 playwright install chromium(或 firefox/webkit),不加参数会装全部,浪费磁盘空间
  • CI/CD 环境(如 github Actions)要确保安装步骤在 pip install playwright 之后、代码运行之前
  • Windows 上如果提示权限错误,别用 PowerShell 的“以管理员身份运行”,改用 CMD 或在项目根目录加 --with-deps 参数重试

怎么让 Playwright 真正比 Selenium 快?关键在 launch 参数

快不是框架自动给的,是你关掉冗余功能换来的。Selenium 默认启动完整 GUI 浏览器,Playwright 默认也开图形界面(尤其在 macos/linux),这反而拖慢自动化流程。

实操建议:

  • 始终加 headless=Trueplaywright.chromium.launch(headless=True),本地调试再设为 False
  • 禁用图片和字体加载能提速 20%–40%,尤其刷大量列表页:args=["--blink-settings=imagesEnabled=false"]
  • 不用 slow_mo(除非调试),它会让每个操作强制等待毫秒,生产环境务必删掉
  • 避免反复 launch / close 浏览器实例,复用 browser 对象,一个进程内只启一次

page.goto() 超时却页面明明打开了?这是导航生命周期没对齐

Playwright 的 goto 默认等 load 事件,但很多 SPA 页面靠 js 渲染,dom 已就绪但 load 没触发,导致假超时;反过来,有些页面 load 很早完成,但核心数据还在 fetch,你接着取 page.query_selector 就拿不到内容。

正确做法是按实际需求选等待策略:

  • 等网络空闲(推荐多数场景):page.goto(url, wait_until="networkidle"),比 load 更靠谱
  • 等某个元素出现(最稳):page.goto(url); page.wait_for_selector("article.title")
  • 禁用等待直接跳转(极少数情况):page.goto(url, wait_until=None),后续全靠手动 wait_for_*

别信文档里写的“默认 load 最安全”——它只对传统 SSR 页面友好。

为什么 page.screenshot() 截图空白或截不到动态内容?

截图时机不对,或者页面没真正渲染完。Playwright 的截图是同步调用,但 JS 渲染异步,尤其带懒加载、IntersectionObserver 或 React Suspense 的页面。

容易踩的坑:

  • 截图前没等关键区域可见:page.wait_for_selector(".main-content", state="visible") 再截
  • 滚动到底部才加载的内容,必须先 page.evaluate("window.scrollTo(0, document.body.scrollHeight)"),再等新节点
  • 截图尺寸受 viewport 启动参数限制,默认是 1280×720,如果页面响应式断点在 1440px 以上,部分内容可能被 CSS 隐藏——启动时加 viewport={"width": 1920, "height": 1080}

真要截长图,别只靠 full_page=True,先确认页面是否支持 document.body.scrollHeight 计算,否则截一半就停。

text=ZqhQzanResources