[扩展推荐] Puphpeteer:Chrome 无头浏览器 Puphpeteer 项目的 PHP 桥梁
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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
不太明白 这个是干什么用的?测试吗?有人能否解答下
@GhostCoder
更多请见 https://github.com/GoogleChrome/puppeteer
@Summer 厉害了 多谢科普
如何用这个 捕获浏览器的alert 并确认关闭掉呢
@GhostCoder
刚发现爬谷歌需要 meta 跳转,但是,访问 meta 中的网址还是需要 meta 跳转,循环炼狱,所以现在用这个
麻烦问下,楼主使用的是laravel哪个版本进行这个demo测试的?

我一直报这个错误,貌似是版本冲突
执行时报 exit code 126 Permission denied 怎么解决