aktuba / php-puppeteer
扩展 puphpeteer
Requires
- php: >=7.1
- ext-json: *
- ext-mbstring: *
- nesk/puphpeteer: ^2.0.0
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)。有关更多信息,请参阅 许可证文件。