pyppeteer:用 Python 操控无头浏览器

网页截图、自动化测试、数据抓取,这些事情绕不开浏览器自动化。Google 的 Puppeteer 在 Node.js 生态里是事实标准,但 Python 用户想用一直只能羡慕。pyppeteer 把这个能力带进了 Python 世界。

正文顶部截图

pyppeteer 是 Puppeteer 的非官方 Python 移植,由开发者 miyakogi 维护。项目用 MIT 协议开源,GitHub 上积累了近 4000 个 Star。

它的核心能力是用代码控制 Chromium 浏览器:打开网页、截屏、填写表单、执行 JavaScript、抓取渲染后的内容。所有操作都在无头模式下运行,不需要打开真实的浏览器窗口。

用法足够简单

安装只一行 pip 命令。首次运行时工具会自动下载一份 Chromium,大小约 100MB,后续使用不需要额外配置。

截取网页截图的代码不过十行:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://example.com')
    await page.screenshot({'path': 'example.png'})
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

在页面内执行 JavaScript 也一样直接。page.evaluate() 方法接受一段 JS 字符串,返回计算结果。获取页面尺寸、提取 DOM 内容、修改元素样式,几行代码就能完成。

由于 Puppeteer 本身由 Chrome 团队维护,API 设计经过了大量实战检验。pyppeteer 几乎原样继承了这套 API,熟悉 Puppeteer 的人基本可以零成本切换。

针对 Python 做了适配

直接移植 JS 库到 Python 不可能完全照搬,pyppeteer 在接口上做了几处调整。

Python 不支持 $ 作为方法名,所以原版的 page.$()page.$$()page.$x() 变成了 page.querySelector()page.querySelectorAll()page.xpath()。顺手还提供了 page.J()page.JJ()page.Jx() 三个简写,照顾喜欢短命名的开发者。

函数参数传递也做了 Python 化处理。Puppeteer 用 JS 对象传参,pyppeteer 同时支持字典和关键字参数两种方式:

# 字典风格
browser = await launch({'headless': True})

# 关键字风格
browser = await launch(headless=True)

page.evaluate() 的行为略有差异。Puppeteer 可以传 JS 函数引用,pyppeteer 只接受字符串。工具会尝试自动判断字符串是函数体还是表达式,但偶尔会误判。遇到这种情况加一个 force_expr=True 参数就能解决。

README区域截图

适合哪些场景

爬取 JS 渲染的页面是典型用途。传统 HTTP 请求库拿不到 SPA 应用动态生成的内容,pyppeteer 直接驱动真实浏览器渲染,再复杂的页面也能抓到。

自动化测试也能用。登录流程、表单提交、按钮点击,这些需要完整浏览器环境的操作,用 pyppeteer 模拟用户行为比单纯发请求可靠得多。

生成网页截图或 PDF 也是顺手的事。服务端渲染的页面转成图片发给用户,或者把报表页面直接保存为 PDF,调用一个方法就够了。

需要注意的点

项目明确标注自己是 Puppeteer 的追随者,不打算添加 Puppeteer 没有的原生 API。它的路线图是跟上 Puppeteer 的版本迭代,而不是另起炉灶。

Python 版本要求 3.6 或以上,3.5 属于实验性支持。项目依赖 asyncio,所有操作都是异步的,这点和 Node.js 版保持了一致。

另外就是首次运行时需要下载 Chromium,在部分网络环境下可能比较慢。可以先跑 pyppeteer-install 命令提前下载好,避免运行时等待。

总体来看,pyppeteer 把 Puppeteer 的核心能力原样搬到了 Python,改动克制,API 熟悉。如果团队成员主要用 Python 又需要浏览器自动化,直接用这个项目就能开工,不需要学一套新工具。

到了 Python,改动克制,API 熟悉。如果团队成员主要用 Python 又需要浏览器自动化,直接用这个项目就能开工,不需要学一套新工具。

更多推荐