[扩展推荐] Puphpeteer:Chrome 无头浏览器 Puphpeteer 项目的 PHP 桥梁

file

Johann Pardanaud 开发的 PuPHPeteer 是 PHP 与 Google Chrome Puppeteer (无头浏览器 headless chrome)API 之间的桥梁。同时,PuPHPeteer 基于另一个由 Johann 开发的叫 Rialto 的包,它可以通过 PHP 来管理 Node 资源。

一些例子

PuPHPeteer 有着和 Puppeteer 相似的例子,让我们试着用 PHP 来调用这些 API 吧。

这里有一个页面导航和截图的例子:

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();

这是一个在页面上执行JS脚本的例子:

use Nesk\PuPHPeteer\Puppeteer;
use Nesk\Rialto\Data\JsFunction;

$puppeteer = new Puppeteer;

$browser = $puppeteer->launch();
$page = $browser->newPage();
$page->goto('https://example.com');

// 通过JS来获取页面的尺寸信息
$dimensions = $page->evaluate(JsFunction::create("
    return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight,
        deviceScaleFactor: window.devicePixelRatio
    };
"));

printf('Dimensions: %s', print_r($dimensions, true));

$browser->close();

一些区别

我认为最显著的区别,就是在 PuPHPeteer 中每个方法的调用都是同步的。

虽然 PuPHPeteer 支持所有 Node 版 Puppeteer 的 API,但还是有一些重要的不同点。最大的一点就是创建 new Puppeteer; 实例,而不是 Node 上使用 require('puppeteer') 的方式。当你通过 new Puppeteer; 创建一个实例的时候,实际上创建了一个由 PHP 控制的 Node 进程。

接下来,你可以给构造器设置参数:

[
    // Node 可执行命令的路径,如果 Node 已经在 PATH 里,就只要这样写就好了
    'executable_path' => 'node',

    // 进程可以阻塞多久(秒)不被终止,
    'idle_timeout' => 60,

    // 一个指令在返回结果前最多等待多久(秒)
    'read_timeout' => 30,

    // 关闭进程时最多等待多久(秒)
    'stop_timeout' => 3,

    // 调试用的 logger 实例 (必须实现 \Psr\Log\LoggerInterface)
    'logger' => null,

    // 开启调试模式(会自动做如下操作):
    //   - 添加参数 --inspect 到 Node 命令中
    //   - 追加堆栈跟踪信息到 Node 的报错消息中
    'debug' => false,
]

PuPHPeteer 要求 PHP >= 7.1 并且 Node >= 8 。可以到 GitHub repo 查看完整的 readme 和 安装说明。干的漂亮,约翰!( 自行脑补翻译语气 (*/ω\*)

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/puphpeteer

译文地址:https://learnku.com/laravel/t/14699/exte...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 7
阿麦

不太明白 这个是干什么用的?测试吗?有人能否解答下

5年前 评论
Summer

@GhostCoder

  • 页面生成 PDF ,这个用例可多了;
  • 可作为 SPA 的 SSR 解决方案 —— https://laravel-china.org/search?q=SSR
  • 自动化测试、UI 测试,你甚至可以测试你的 JS 里的键盘输入;
  • 捕抓 timeline trace ,为页面性能问题分析提供接口
  • 测试 Chrome Extensions.

更多请见 https://github.com/GoogleChrome/puppeteer

5年前 评论
阿麦

@Summer 厉害了 多谢科普

5年前 评论
yangweijie

如何用这个 捕获浏览器的alert 并确认关闭掉呢

5年前 评论
小李世界 4年前

@GhostCoder

刚发现爬谷歌需要 meta 跳转,但是,访问 meta 中的网址还是需要 meta 跳转,循环炼狱,所以现在用这个

        use Nesk\Puphpeteer\Puppeteer;

        $puppeteer = new Puppeteer();
        $browser = $puppeteer->launch([
            'args' => ['--no-sandbox', '--disable-setuid-sandbox'],
        ]);

        $page = $browser->newPage();
        $page->goto("https://www.google.com/search?q=React&num=10&start=0&hl=zh-CN");
        $html = $page->content();

        $browser->close();
4年前 评论

麻烦问下,楼主使用的是laravel哪个版本进行这个demo测试的?
我一直报这个错误,貌似是版本冲突
file

4年前 评论
sunrise丶 4年前
goudan (作者) 4年前
yangweijie

执行时报 exit code 126 Permission denied 怎么解决

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!