数据STUDIO

Selenium 已过时,Playwright 正悄然崛起

Image

Image

写过爬虫的你应该对 Selenium 都比较熟悉。

坦白说,我也经常使用 Selenium,并且用的还不错。虽然用起来有点笨重,但它确实能完成任务。有一天,我跟同事聊起他之前做过的一个需求:客户门户网站自动化登录流程,听起来很简单:打开页面、填写账号、抓取数据。但这个网站状态很不稳定,Selenium 有一半时间找不到按钮,另一半时间直接中途崩溃。

在他无数次搜索“Selenium alternative python”时,无数次看到 Playwright,后来他就去了解了一番,结果爱上了他。听说Playwright之前一直活跃在 JavaScript 生态里,但此时它已经有了成熟且功能完善的 Python 版本。我试了一下——就这一次尝试,彻底改变了我对自动化的认知。

一旦理解了 Playwright 的设计理念,你就再也回不去了。

Playwright:不仅是“另一个自动化工具”

首先明确一点:Playwright 并不只是“又一个 Web 自动化工具”。它是一套完整的浏览器自动化框架,由曾开发 Puppeteer 的原班团队打造,但有一个关键升级:原生支持多浏览器(Chromium、Firefox、WebKit)、多标签、多上下文和多用户会话。

用更直白的话来说:

  • 它不止会点击按钮,还能理解页面上下文;
  • 它不会傻傻干等,而是能主动监听关键事件;
  • 它不仅可以在前台运行,还支持高速、无头甚至并行执行。

为啥建议你用Playwright

1. 安装简单

Selenium 需要配置驱动,而 Playwright 只需两行命令,自动下载所需浏览器:

pip install playwright
playwright install

就这样。再也不用纠结驱动版本、兼容性问题,或者“Chrome 为什么今天启动不了?”。

2. 抓取动态页面,不易被反爬

我曾需要从一个用 JavaScript 动态渲染的仪表盘抓数据,Selenium 有一半机会返回空白页面。Playwright 一次就成功:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com/dashboard")
    title = page.text_content("h1.dashboard-title")
    print("Dashboard Title:", title)
    browser.close()

不一样的是:

  • 不再需要手动写 time.sleep(),它能智能等待;
  • 动态内容加载稳定,如同真实用户访问;
  • 速度明显快于 Selenium,而且更稳定。

3. 支持双重验证与会话持久化

我有个需求是每天自动登录并下载销售报告,网站还带双重验证(2FA)。Selenium 处理会话持久化一直很不稳定,Playwright 却做得非常优雅:

# 保存登录状态
context = browser.new_context(storage_state="state.json")

# 下次直接恢复会话
context = browser.new_context(storage_state="state.json")
page = context.new_page()
page.goto("https://example.com/dashboard")

登录流程只需配置一次,之后全程自动化运行。这不只是自动化,而是可重复、高可用的自动化。

4. 轻松绕过登录限制

对于需要登录后才能访问的页面,Playwright 将其视为常规操作,而非特殊情况:

page.fill('input[name="email"]', "[email protected]")
page.fill('input[name="password"]', "mysecret")
page.click('button[type="submit"]')
page.wait_for_url("**/dashboard")

你不需要靠“猜”来判断是否登录成功,可以直接等待目标 URL 或页面元素出现:

page.wait_for_selector("div.user-stats")

如果用 Selenium,你可能还在不停地 sleep() 和试错。

5. 无头模式配合 Cron job,实现全自动调度

我每天会用几个定时脚本抓取汇率、考勤记录等数据,全部通过 cron 调度运行。Playwright 无头模式让这一切变得极其稳定:

browser = p.chromium.launch(headless=True)

没有图形界面,没有意外中断,只有安静、稳定的自动化任务。

6. 将网页一键导出为 PDF

最近我写了个工具,把 Web 仪表盘转为每日 PDF 报告,用 Playwright 只花了几分钟:

page.pdf(path="report.pdf", format="A4")

就这样。它能完整保留样式和图表,打印效果和网页看到的完全一致。

7. 真正可用的并行测试

最让我惊喜的是,Playwright 支持独立的浏览器上下文,可以同时运行多个会话,彼此隔离:

context1 = browser.new_context()
context2 = browser.new_context()

page1 = context1.new_page()
page2 = context2.new_page()

我曾经用它同时在三个标签页中模拟三个不同角色的用户操作,没有会话冲突,也不需要各种 Hack,只有干净、并行的自动化。

为什么越来越多人默默转向 Playwright?

因为它精准击中了每一个认真做自动化的开发者最终都会遇到的痛点:

  • 页面加载不稳定,需要反复调整等待时间;
  • 无头模式行为不一致,难以调试;
  • 会话和状态管理复杂;
  • 对现代 JavaScript 密集型网站支持不佳。

如果你要做的不是简单脚本,而是一个健壮的自动化系统,Selenium 会越用越吃力,而 Playwright 却越用越顺手。

写在最后

有一个很少有人公开谈论的事实:大多数开发者只有在旧工具彻底不行时,才会尝试更换。

但 Playwright 不仅仅是一个“替代品”。它是我从一开始就希望拥有的工具——尤其当我需要自动化一切,从商业仪表盘到日常重复性工作。

如果你在 2025 年还在代码里写 time.sleep(2),那你其实不是在自动化,而是在猜测。

早点换吧,你会感谢自己的。

🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递ImageImage