当我写下这些文字时,距 PuPHPeteer 最新版本已经过去了近两年。尽管人们对这个项目充满热情,但我不再有动力支持它的开发,主要是因为它对我来说从来没有真正的用处。所以是时候对你说实话了,PuPHPeteer 不再维护了。
但是,这是社区维护的分叉列表:
如果您创建了一个分叉并计划维护它,请告诉我,我会将其链接到此处。
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
而不是需要 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 ,
]
如果您使用的超时时间超过 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 中发生错误,将抛出NodeFatalException
并关闭进程,您将必须创建一个新的Puppeteer
实例。
为了避免这种情况,您可以通过在指令前添加->tryCatch
来要求 Node 捕获这些错误:
use Nesk Rialto Exceptions Node ;
try {
$ page -> tryCatch -> goto ( ' invalid_url ' );
} catch ( Node Exception $ exception ) {
// Handle the exception...
}
相反,将抛出NodeException
,Node 进程将保持活动状态并可用。
麻省理工学院许可证 (MIT)。请参阅许可证文件以获取更多信息。
PuPHPeteer 的徽标由以下部分组成:
感谢 Laravel News 选择徽标的图标和颜色。