aktuba/php-puppeteer

扩展 puphpeteer

0.1.0.9 2019-07-09 13:28 UTC

This package is auto-updated.

Last update: 2024-09-29 05:21:37 UTC


README

基于 Puppeteer 的 PhpPupeeteer。一个为 PHP 提供完整 API 的 Puppeteer 桥接器,基于 Puppeteer,并支持管理 Node 资源的 Rialto 包。

以下是一些示例,这些示例是从 Puppeteer 的文档中借用的,并已适配到 PHP 语法:

示例 - 导航到 https://example.com 并将屏幕截图保存为 example.png

use PhpPupeeteer\PhpPupeeteer;

$phpPuppeteer = new PhpPupeeteer;
$browser = $phpPuppeteer->getBrowser([
    'args' => [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--disable-dev-shm-usage',
        '--disable-gpu',
        '--incognito',
    ],
]);
$page = $browser->newPage();
$page->gotoWithWait('https://example.com');
$page->screenshot(['path' => 'example.png']);
$browser->close();

示例 - 显示浏览器窗口

use PhpPupeeteer\PhpPupeeteer;

$phpPuppeteer = new PhpPupeeteer;
$browser = $phpPuppeteer->getBrowser([
    'headless' => false,
    'args' => [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--disable-dev-shm-usage',
        '--incognito',
        '--start-maximized',
    ],
]);
$page = $browser->newPage();
$page->gotoWithWait('https://example.com');
$page->screenshot(['path' => 'example.png']);
$browser->close();

示例 - 在页面上下文中评估脚本

use Puphpeteer\Puppeteer;
use Puphpeteer\Data\Js;

$puppeteer = new PhpPupeeteer;

$browser = $phpPuppeteer->getBrowser();
$page = $browser->newPage();
$page->gotoWithWait('https://example.com');

// Get the "viewport" of the page, as reported by the page.
$dimensions = $page->evaluate(Js::createWithBody("
    return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight,
        deviceScaleFactor: window.devicePixelRatio,
    };
"));

printf('Dimensions: %s', print_r($dimensions, true));

$browser->close();

要求与安装

此包需要 PHP >= 7.1 和 Node >= 8。

使用以下两个命令行安装它:

composer require aktuba/php-puppeteer
npm install @nesk/puphpeteer

PhpPupeeteer 和 Puppeteer 之间的显著差异

Puppeteer 的类必须实例化

而不是需要 Puppeteer

const puppeteer = require('puppeteer');

您必须实例化 PhpPupeeteer

use PhpPupeeteer\PhpPupeeteer;

$puppeteer = PhpPupeeteer;

这将创建一个由 PHP 控制的新的 Node 进程。

您也可以向构造函数传递一些选项,请参阅 Rialto 的文档。PuPHPeteer 还扩展了这些选项

[
    // Logs the output of Browser's console methods (console.log, console.debug, etc...) to the PHP logger
    'log_browser_console' => false,
]
⏱ 想要在 Puppeteer 的 API 中使用高于 30 秒的超时吗?

如果您使用高于 30 秒的超时,您将不得不为 read_timeout 选项设置更高的值(默认:35

$phpPuppeteer = $phpPuppeteer->getBrowser([
	'read_timeout' => 65, // In seconds
]);

$browser->newPage()->goto($url, [
    'timeout' => 60000, // In milliseconds
]);

无需使用 await 关键字

在 PhpPupeeteer 中,每个方法调用或属性获取/设置都是同步的。

一些方法已被别名化

以下方法已被别名化,因为 PHP 不支持方法名称中的 $ 字符

  • $ => querySelector
  • $$ => querySelectorAll
  • $x => querySelectorXPath
  • $eval => querySelectorEval
  • $$eval => querySelectorAllEval

就像使用原始方法一样使用这些别名

$divs = $page->querySelectorAll('div');

必须使用 \PhpPupeeteer\Data\Js 创建已评估的函数

在页面上下文中评估的函数必须使用 JsFunction 编写,这些函数的正文必须使用 JavaScript 而不是 PHP 编写。

use PhpPupeeteer\Data\Js;

$pageFunction = Js::createWithParameters(['element'])
    ->body("return element.textContent")
;

必须使用 ->tryCatch 捕获异常

如果 Node 发生错误,将抛出 Node\FatalException 并关闭进程,您将必须创建一个新的 Puppeteer 实例。

为了避免这种情况,您可以让 Node 捕获这些错误,在您的指令前加上 ->tryCatch

use Nesk\Rialto\Exceptions\Node;

try {
    $page->tryCatch->goto('invalid_url');
} catch (Node\Exception $exception) {
    // Handle the exception...
}

相反,将抛出 Node\Exception,Node 进程将保持活动状态并可用于使用。

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件