用 PHP 控制浏览器?chrome-php 真香

最近有个需求,要定时截取几个网页的页面截图,还得把动态加载的内容也截进去。一开始用 PHP 的 file_get_contents 和 cURL 抓,结果发现那些内容是 JavaScript 渲染出来的,抓回来全是空白。折腾半天,最后找到了 chrome-php 这个库,用 PHP 直接控制 Chrome 浏览器,问题迎刃而解。

它是干嘛的?

简单说,chrome-php 让你能用 PHP 代码控制 Chrome 或 Chromium 浏览器的无头模式(Headless)。无头模式就是浏览器不显示界面,在后台默默运行,特别适合做自动化任务。

能干的事情还挺多的:打开网页、截图、生成 PDF、执行 JavaScript、模拟点击输入、抓取动态内容……基本你能用浏览器干的事,它都能用代码实现。

装上试试

Composer 一把梭:

1
composer require chrome-php/chrome

注意你的环境得有 Chrome 或 Chromium 浏览器,版本 65 以上就行。PHP 版本要求 7.4+,现在应该都能满足。

最简单的例子

先来个截图压压惊:

1
2
3
4
5
6
7
8
9
use HeadlessChromium\BrowserFactory;

$browser = BrowserFactory::createBrowser();
$page = $browser->createPage();

$page->navigate('https://www.baidu.com')->waitForNavigation();
$page->screenshot()->saveToFile('baidu.png');

$browser->close();

几行代码,百度的首页截图就到手了。waitForNavigation() 是等待页面加载完成,不然截图可能还是空白。

抓动态内容

这个才是我当初找这个库的原因。有些网站的内容是 JS 渲染的,普通的 HTTP 请求拿不到,但用这个库就能轻松解决:

1
2
3
4
5
$page->navigate('https://example.com/spa-page')->waitForNavigation();

// 执行 JS 获取渲染后的内容
$html = $page->evaluate('document.body.innerHTML')->getReturnValue();
echo $html;

evaluate() 方法可以执行任意 JavaScript 代码,返回值用 getReturnValue() 拿到。想爬什么数据,直接写 JS 选择器提取就行。

模拟用户操作

有些网站需要登录才能看内容,这个库也支持模拟点击和输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$page->navigate('https://example.com/login')->waitForNavigation();

// 填用户名密码
$page->find('input[name="username"]')->sendKeys('my_username');
$page->find('input[name="password"]')->sendKeys('my_password');

// 点击登录
$page->find('button[type="submit"]')->click();

// 等待页面跳转
$page->waitForReload();

// 现在可以操作登录后的页面了
$page->screenshot()->saveToFile('after_login.png');

find() 方法支持 CSS 选择器,找元素很方便。

生成 PDF

顺便提一下,它还能把网页导出成 PDF:

1
2
3
4
5
$page->pdf([
'printBackground' => true,
'paperWidth' => 210,
'paperHeight' => 297
])->saveToFile('report.pdf');

做个网页版的报表导出功能,这个就够用了。

调试小技巧

开发的时候如果想知道浏览器到底在干嘛,可以把 headless 关掉,让浏览器窗口显示出来:

1
2
3
4
$browserFactory = new BrowserFactory();
$browser = $browserFactory->createBrowser([
'headless' => false, // 显示浏览器窗口
]);

这样就能看到每一步操作的效果了,调试完再改回 true 就行。

还有很多功能

Cookie 管理、代理设置、自定义 User-Agent、鼠标移动模拟……功能还挺多的。我就不一一列举了,感兴趣的可以去看官方文档:https://github.com/chrome-php/chrome

README 写得很详细,安装配置、API 文档、常见问题都有,基本上看一遍就能上手。

最后

如果你的项目里有需要浏览器自动化的场景,chrome-php 绝对值得一试。之前我还试过 Selenium 和 Puppeteer,要么配置麻烦要么得切语言,这个库直接在 PHP 里搞定,对 PHP 项目来说方便太多了。

以上就是我的一点使用心得,希望能帮到有同样需求的小伙伴。