doghouseagency / puphpeteer
PHP的Puppeteer桥梁,支持全部API。
Requires
- php: >=7.3
- ext-json: *
- nigelcunningham/rialto: master
- psr/log: ^1.0 || ^2.0 || ^3.0
- vierbergenlars/php-semver: master
Requires (Dev)
- monolog/monolog: ^2.0
- phpunit/phpunit: ^9.0
- symfony/console: ^4.0|^5.0|^6.0
- symfony/process: ^4.0|^5.0|^6.0
This package is not auto-updated.
Last update: 2024-09-26 10:38:47 UTC
README
PHP 8.1 兼容性:
此包依赖于php-semver,但目前(2023年2月28日)尚未为PHP 8.1添加补丁。补丁可在以下地址找到:https://github.com/RobinDev/php-semver/tree/patch-1,可以通过以下方式使用composer安装:
在需要puphpeteer的项目中添加自定义仓库
"RobinDev/php-semver": {
"type": "vcs",
"url": "https://github.com/RobinDev/php-semver"
}
然后使用composer安装Puphpeteer、Rialto和php-semver的升级版本
composer require nigelcunningham/puphpeteer:master nigelcunningham/rialto:master vierbergenlars/php-semver:dev-patch-1
这将引入分叉的php-semver。
我在完成上述步骤后写下这段话。如果需要进一步的修改,我也会分叉php-semver并修改上述内容。
===
PHP的Puppeteer桥梁,支持全部API。基于Rialto,一个用于从PHP管理Node资源的包。
以下是一些示例,这些示例是从Puppeteer的文档借用的,并适应了PHP的语法
示例 - 导航到 https://example.com 并将截图保存为 example.png
use NigelCunningham\Puphpeteer\Puppeteer;
$puppeteer = new Puppeteer;
$browser = $puppeteer->launch();
$page = $browser->newPage();
$page->goto('https://example.com');
$page->screenshot(['path' => 'example.png']);
$browser->close();
示例 - 在页面上下文中评估脚本
use NigelCunningham\Puphpeteer\Puppeteer;
use NigelCunningham\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();
示例 - 发送POST请求
$puppeteer = new Puppeteer();
$browser = $puppeteer->launch();
$page = $browser->newPage();
$page->setRequestInterception(true);
$page->on('request', new JsFunction(
['interceptedRequest'],
"
var data = {
'method': 'POST',
'postData': '" . http_build_query($options['form_params']) . "'
};
interceptedRequest.continue(data);
"
));
$response = $page->goto('https://example.com');
需求和安装
此包需要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`):```php $puppeteer = new Puppeteer([ 'read_timeout' => 65, // 以秒为单位 ]); $puppeteer->launch()->newPage()->goto($url, [ 'timeout' => 60000, // 以毫秒为单位 ]); ```
不需要使用await
关键字
在PuPHPeteer中,每个方法调用或属性获取/设置都是同步的。
一些方法已被重命名
以下方法已被重命名,因为PHP不支持方法名称中的$
字符
$
>querySelector
$$
>querySelectorAll
$x
>querySelectorXPath
$eval
>querySelectorEval
$$eval
>querySelectorAllEval
就像使用原始方法一样使用这些别名
$divs = $page->querySelectorAll('div');
必须使用JsFunction
创建评估函数
在页面上下文中评估的函数必须使用JsFunction
类创建,这些函数的正文必须用JavaScript编写而不是PHP。
use NigelCunningham\Rialto\Data\JsFunction;
$pageFunction = JsFunction::createWithParameters(['element'])
->body("return element.textContent");
必须用->tryCatch
捕获异常
如果Node中发生错误,将会抛出Node\FatalException
异常,进程将会关闭,您需要创建一个新的Puppeteer
实例。
为了避免这种情况,您可以在指令前加上->tryCatch
来让Node捕获这些错误。
use NigelCunningham\Rialto\Exceptions\Node;
try {
$page->tryCatch->goto('invalid_url');
} catch (Node\Exception $exception) {
// Handle the exception...
}
相反,将会抛出Node\Exception
异常,Node进程将保持活跃并可使用。
Puppeteer插件
要使用puppeteer-extra插件,请将其添加到您的项目中。
npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
然后使用js_extra选项覆盖js包含。
$puppeteer = new Puppeteer([
'js_extra' => /** @lang JavaScript */ "
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
instruction.setDefaultResource(puppeteer);
"
]);
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。
标志归属
PuPHPeteer的标志由以下元素组成
- Puppet,由Luis Prado创作,来自Noun Project。
- Elephant,由Lluisa Iborra创作,来自Noun Project。
感谢Laravel News挑选了标志的图标和颜色。