patriciaparish/puphpeteer

PHP的Puppeteer桥接器,支持整个API。

v2.0.2 2024-08-03 19:57 UTC

This package is auto-updated.

Last update: 2024-09-04 21:58:06 UTC


README

当我写下这些文字时,距离PuPHPeteer的最新版本发布已经将近两年了。尽管人们对这个项目充满热情,但我已经没有动力继续支持其开发,主要是因为它对我几乎没有实际用途。所以,让我们面对现实,PuPHPeteer不再维护。

然而,这里有一个社区维护的分支列表

如果你创建了一个分支并计划维护它,请让我知道,我将在这里添加链接。

PuPHPeteer

PHP Version Composer Version Node Version NPM Version Build Status

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 的标志由以下元素组成:

感谢 Laravel News 为标志选择了图标和颜色。