pyppeteer:Python 版无头浏览器自动化工具

pyppeteer/pyppeteer 目前收获了 3,944 个 Star:

正文顶部截图

README区域截图

pyppeteer 是 puppeteer 的非官方 Python 移植版本,用于控制无头 Chrome 或 Chromium 浏览器完成自动化任务。它适合需要程序化操作网页的场景,比如截图、爬取数据、自动化测试、页面性能分析等。

项目采用 MIT 许可证,同时包含部分 Apache 2.0 许可的代码。文档和 API 参考可以在项目主页找到。

安装要求 Python 3.6 及以上版本,3.5 版本为实验性支持。首次运行 pyppeteer 时会自动下载 Chromium,体积约 100MB。如果不希望程序在运行时自动下载,可以先执行 pyppeteer-install 命令完成准备工作。

通过 pip 直接安装:

python3 -m pip install pyppeteer

也可以从源码安装开发版本。

基础用法很直接。以下代码打开网页并截图保存:

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 并获取返回值:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://example.com')

    dimensions = await page.evaluate('''() => {
        return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight,
            deviceScaleFactor: window.devicePixelRatio,
        }
    }''')

    print(dimensions)
    await browser.close()

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

pyppeteer 的 API 设计与 puppeteer 基本一致,熟悉 puppeteer 的用户可以较快上手。不过 Python 和 JavaScript 的语言特性差异导致部分接口存在调整。

pyppeteer 的函数参数同时支持字典和关键字参数。例如启动浏览器时,既可以用字典风格:

browser = await launch({'headless': True})

也可以使用关键字参数:

browser = await launch(headless=True)

在元素选择器方面,puppeteer 使用 、 、 、 、 x 作为方法名,Python 不支持这种命名方式,所以 pyppeteer 改用 querySelector、querySelectorAll、xpath。同时提供了 J、JJ、Jx 作为简写形式。

evaluate 方法的参数处理也有区别。puppeteer 可以直接传入 JavaScript 函数或表达式,pyppeteer 则统一接收字符串。它会尝试自动判断字符串是函数还是表达式,如果判断失误导致报错,可以添加 force_expr=True 强制按表达式处理:

content = await page.evaluate('document.body.textContent', force_expr=True)

获取元素文本内容时,先选择元素再传入 evaluate:

element = await page.querySelector('h1')
title = await page.evaluate('(element) => element.textContent', element)

项目目前的开发方向是跟上 puppeteer 的更新节奏,不计划添加 puppeteer 没有的原生 API。对于需要在 Python 环境中进行浏览器自动化的开发者来说,pyppeteer 是一个可以参考的选项。

uppeteer 的更新节奏,不计划添加 puppeteer 没有的原生 API。对于需要在 Python 环境中进行浏览器自动化的开发者来说,pyppeteer 是一个可以参考的选项。

更多推荐