extractr-io/puphpeteer

此包已被弃用,不再维护。作者建议使用 nesk/puphpeteer 包。

PuPHPeteer 的 PHP 桥接器,支持整个 API。

2.0.0 2020-12-01 11:49 UTC

README

当我写下这些话时,PuPHPeteer 的最新版本发布已经近两年了。尽管这个项目受到很多人的热情支持,但我已经没有动力去支持它的开发了,主要是因为它对我来说从未真正有用。所以,我必须诚实地告诉你,PuPHPeteer 已经不再维护。

然而,以下是一些由社区维护的分支列表

如果你创建了分支并计划维护它,请告诉我,我会在这里链接它。

PuPHPeteer

100672192-dd258500-3361-11eb-845f-e8b5109752e4.png

PHP Version Composer Version Node Version NPM Version Build Status

PHP 的 Puppeteer 桥接器,支持整个 API。基于 Rialto,一个用于从 PHP 管理 Node 资源的包。

以下是一些来自 Puppeteer 文档的示例 借鉴 并调整为 PHP 语法

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

use Nesk\Puphpeteer\Puppeteer;

$puppeteer = new Puppeteer;
$browser = $puppeteer->launch();

$page = $browser->newPage();
$page->goto('https://example.com');
$page->screenshot(['path' => 'example.png']);

$browser->close();

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

use Nesk\Puphpeteer\Puppeteer;
use Nesk\Rialto\Data\JsFunction;

$puppeteer = new Puppeteer;

$browser = $puppeteer->launch();
$page = $browser->newPage();
$page->goto('https://example.com');

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

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

$browser->close();

要求和安装

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

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

composer require nesk/puphpeteer
npm install @nesk/puphpeteer

PuPHPeteer 和 Puppeteer 之间的显著差异

Puppeteer 的类必须实例化

而不是要求 Puppeteer

const puppeteer = require('puppeteer');

你必须实例化 Puppeteer

$puppeteer = new Puppeteer;

这将创建一个由 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

$puppeteer = new Puppeteer([
    'read_timeout' => 65, // In seconds
]);

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

不需要使用 await 关键字

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

一些方法已被别名化

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

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

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

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

评估的函数必须使用 JsFunction 创建

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

use Nesk\Rialto\Data\JsFunction;

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

异常必须使用 ->tryCatch 捕获

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

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

use Nesk\Rialto\Exceptions\Node;

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

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

许可证

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

标志归属

PuPHPeteer 的标志由以下组成

感谢 Laravel News 为标志选择了图标和颜色。