larasync / puphpeteer
PHP的Puppeteer桥接器,支持整个API。
1.6.0
2019-06-24 11:12 UTC
Requires
- php: >=7.1
- nesk/rialto: ^1.2.0
- psr/log: ^1.0
- vierbergenlars/php-semver: ^3.0.2
Requires (Dev)
- codedungeon/phpunit-result-printer: >=0.6 <1.0
- monolog/monolog: ^1.23
- phpunit/phpunit: ^6.5|^7.0
- symfony/process: ^4.0
README
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.1和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实例。
为了避免这种情况,您可以要求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)。有关更多信息,请参阅许可证文件。
标志归属
PuPHPeteer的标志由以下组成
- Puppet 由Luis Prado来自 Noun Project。
- 大象 由 Lluisa Iborra 在 名词项目 提供。
感谢 Laravel 新闻 为标志选择了图标和颜色。
