用 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 | use HeadlessChromium\BrowserFactory; |
几行代码,百度的首页截图就到手了。waitForNavigation() 是等待页面加载完成,不然截图可能还是空白。
抓动态内容
这个才是我当初找这个库的原因。有些网站的内容是 JS 渲染的,普通的 HTTP 请求拿不到,但用这个库就能轻松解决:
1 | $page->navigate('https://example.com/spa-page')->waitForNavigation(); |
evaluate() 方法可以执行任意 JavaScript 代码,返回值用 getReturnValue() 拿到。想爬什么数据,直接写 JS 选择器提取就行。
模拟用户操作
有些网站需要登录才能看内容,这个库也支持模拟点击和输入:
1 | $page->navigate('https://example.com/login')->waitForNavigation(); |
find() 方法支持 CSS 选择器,找元素很方便。
生成 PDF
顺便提一下,它还能把网页导出成 PDF:
1 | $page->pdf([ |
做个网页版的报表导出功能,这个就够用了。
调试小技巧
开发的时候如果想知道浏览器到底在干嘛,可以把 headless 关掉,让浏览器窗口显示出来:
1 | $browserFactory = new BrowserFactory(); |
这样就能看到每一步操作的效果了,调试完再改回 true 就行。
还有很多功能
Cookie 管理、代理设置、自定义 User-Agent、鼠标移动模拟……功能还挺多的。我就不一一列举了,感兴趣的可以去看官方文档:https://github.com/chrome-php/chrome
README 写得很详细,安装配置、API 文档、常见问题都有,基本上看一遍就能上手。
最后
如果你的项目里有需要浏览器自动化的场景,chrome-php 绝对值得一试。之前我还试过 Selenium 和 Puppeteer,要么配置麻烦要么得切语言,这个库直接在 PHP 里搞定,对 PHP 项目来说方便太多了。
以上就是我的一点使用心得,希望能帮到有同样需求的小伙伴。