当前位置: 首页 > 后端技术 > PHP

在Laravel中使用puppeteer收集异步加载的网页内容

时间:2023-03-29 22:37:50 PHP

收集网页内容是一个很常见的需求。与传统的静态页面相比,curl可以应付。但是如果页面中有动态加载的内容,比如某些页面中通过ajax加载的文章的文本内容,如果某些页面经过一些额外的处理(图片地址替换等...)已经加载,而你想收集这些处理过的内容。那么牛逼的curl就很无奈了。做过类似需求的人可能会说,老铁,上PhantomJS吧!是的,这是一种方式,长期以来,PhantomJS是为数不多的能够解决这种需求的工具中的佼佼者。不过今天要介绍的是一个后来居上的工具——puppeteer,它随着ChromeHeadless技术的兴起而迅速发展起来。而且很重要的是,puppeteer是由Chrome官方团队开发维护的,可以说是相当靠谱了!Puppeteer是一个js包。如果你想在Laravel中使用它,你需要另一个神器spatie/browsershot。安装spatie/browsershotbrowsershot是大神团队spatie$composerrequirespatie/browsershotinstallpuppeteer$npmipuppeteer--save也可以全局安全的puppeteer的composer包但是就个人经验来说还是推荐的将其安装在项目中这样不同的项目就不会受到同时全局安装的puppeteer的影响。另外在项目中安装也方便使用phpdeployer升级(phpdeploy升级不会影响线上项目的运行,要知道升级/安装puppeteer是非常耗时的,不保证一次性成功)。安装puppeteer时将下载Chromium-Browser。鉴于我们特殊的国情,很有可能无法下载。对此,请各位大侠大显身手……以今日头条手机版内容为例。使用Spatie\Browsershot\Browsershot;publicfunctiongetBodyHtml(){$newsUrl='https://m.toutiao.com/i6546884151050502660/';$html=Browsershot::url($newsUrl)->windowSize(480,800)->userAgent('Mozilla/5.0(Linux;Android6.0;Nexus5Build/MRA58N)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132MobileSafari/537.36')->mobile()->touch()->bodyHtml();\Log::info($html);}运行后可以在日志中看到如下内容(截图只是其中的一部分)。此外,您还可以将页面保存为图片或PDF文件。使用Spatie\Browsershot\Browsershot;publicfunctiongetBodyHtml(){$newsUrl='https://m.toutiao.com/i6546884151050502660/';Browsershot::url($newsUrl)->windowSize(480,800)->userAgent('Mozilla/5.0(Linux;Android6.0;Nexus5Build/MRA58N)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132MobileSafari/537.36')->mobile()->touch()->setDelay(1000)->save(public_path('images/toutiao.jpg'));}图中那些方框与系统字体有关.代码中使用了setDelay()方法以允许在加载内容后截取屏幕截图。简单粗暴,未必是最好的解决方案。可能出现的问题系统必须支持Chromium浏览器。当然现在大部分浏览器都支持了。否则,没有办法。让我们使用PhantomJS。项目中安装puppeteer后,调用时可能会出现权限问题,需要对项目下的/node_modules/puppeteer目录有适当的权限。总结Puppeteer用于测试、采集等场景,是一个非常强大的工具。对于采光任务来说,足够了。比如本文是用来采集Laravel(php)中的一些小页面,但是如果需要快速采集大量的内容,还是用Python什么的比较好。