patriciaparish / puphpeteer
PHP的Puppeteer桥接器,支持整个API。
Requires
- php: >=8.1
- patriciaparish/rialto: ^1.4.2
- psr/log: ^3.0
- vierbergenlars/php-semver: ^3.0.2
Requires (Dev)
- monolog/monolog: ^2.0
- phpunit/phpunit: ^9.5
- symfony/console: ^4.0|^5.0|^6.4|^7.1
- symfony/process: ^4.0|^5.0|^6.4|^7.1
README
当我写下这些文字时,距离PuPHPeteer的最新版本发布已经将近两年了。尽管人们对这个项目充满热情,但我已经没有动力继续支持其开发,主要是因为它对我几乎没有实际用途。所以,让我们面对现实,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 patriciaparish/puphpeteer npm install @nesk/puphpeteer
Puppeteer插件
要使用puppeteer-extra插件,请将其添加到您的项目中
npm i puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
编辑src/PuppeteerConnectionDelegate.js,将第31行 'instruction.setDefaultResource(puppeteer);' 修改为以下内容
if (this.options.js_extra) { eval(this.options.js_extra); } else { const puppeteer = require('puppeteer'); instruction.setDefaultResource(puppeteer); }
然后使用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); " ]);
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 的标志由以下元素组成:
- Puppet,由 Noun Project 的 Luis Prado 提供。
- Elephant,由 Noun Project 的 Lluisa Iborra 提供。
感谢 Laravel News 为标志选择了图标和颜色。