PHP使用puppeteer抓取JS渲染后的页面内容
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">环境依赖</a></li><li><a href="#_label1">puppeteer</a></li><li><a href="#_label2">离线安装Chromium</a></li><li><a href="#_label3">跳过安装chromium</a></li><li><a href="#_label4">获取需要下载的chromium版本号</a></li><li><a href="#_label5">下载对应版本的chromium</a></li><li><a href="#_label6">解压</a></li><li><a href="#_label7">spatie/browsershot</a></li><li><a href="#_label8">使用</a></li><li><a href="#_label9"> 总结</a></li></ul></div><p>最近遇到一个问题,需要爬取js渲染后的网页内容,因此研究了下相关实现方式。主要借助<code>puppeteer</code>实现,它是一个Node库,要想在PHP中使用,还借助了<code>spatie/browsershot</code>。</p><p class="maodian"><a name="_label0"></a></p><h2>环境依赖</h2>
<table><tbody><tr><th>环境</th><th>要求</th></tr><tr><td>Node</td><td>>=7.6.0</td></tr><tr><td>PHP</td><td>>=7.1</td></tr><tr><td>PHP extension</td><td>php_sockets, php_exif</td></tr></tbody></table>
<p class="maodian"><a name="_label1"></a></p><h2>puppeteer</h2>
<p><a href="https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fpuppeteer%2Fpuppeteer" rel="external nofollow" target="_blank">Puppeteer</a>是一个<code>Node</code>库,我是直接在php项目下使用npm安装这个库,然后借助<code>spatie/browsershot</code>来调用它。读者也可以新建一个node项目安装这个库,然后对外暴漏一个端口通过接口的方式传递url返回html内容的方式实现。</p>
<div><div class="jb51code"><pre class="brush:bash;">npm i puppeteer --save
</pre></div></div>
<p class="maodian"><a name="_label2"></a></p><h2>离线安装Chromium</h2>
<p>安装<code>puppeteer</code>时会下载<code>Chromium</code>,因为众所周知的原因可能会下载不下来,因此下面提供了离线下载的方式。</p>
<p class="maodian"><a name="_label3"></a></p><h2>跳过安装chromium</h2>
<p>如果已经运行上一步的命令并且正在下载<code>Chromium</code>了,那可以直接<code>Ctrl+C</code>停止任务。如果还没运行,就使用下面的命令安装。</p>
<div><div class="jb51code"><pre class="brush:bash;">npm i puppeteer --ignore-scripts
</pre></div></div>
<p class="maodian"><a name="_label4"></a></p><h2>获取需要下载的chromium版本号</h2>
<p>打开<code>/node_modules/puppeteer/package.json</code>搜索<code>chromium_revision</code>对应的<strong>版本号</strong></p>
<div><div class="jb51code"><pre class="brush:json;">"puppeteer": {
"chromium_revision": "756035",
"firefox_revision": "latest"
}
</pre></div></div>
<p class="maodian"><a name="_label5"></a></p><h2>下载对应版本的chromium</h2>
<blockquote><p>用上面的版本号替换掉下方花括号里的字符,比如我本地是<code>win x64</code>,下载地址就是<code>https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win_x64/756035/chrome-win.zip</code></p></blockquote>
<div><div class="jb51code"><pre class="brush:plain;">mac版下载地址:
https://commondatastorage.googleapis.com/chromium-browser-snapshots/Mac/{chromium版本}/chrome-mac.zip
windows 64位版本下载地址:
https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win_x64/{chromium版本}/chrome-win.zip
windows 32位版本下载地址:
https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win/{chromium版本}/chrome-win.zip
Linux X86版本下载地址:
https://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux/{chromium版本}/chrome-linux.zip
Linux X64版本下载地址:
https://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/{chromium版本}/chrome-linux.zip
</pre></div></div>
<p class="maodian"><a name="_label6"></a></p><h2>解压</h2>
<p>将下载下来的<code>chromium</code>安装包解压到<code>puppeteer</code>中的<code>.local_chromium/win64-{chromium版本号}/</code>目录下。以我的为例就是<code>/node_modules/puppeteer/.local_chromium/win64-756035/chrome-win/</code>。搞定~</p>
<p class="maodian"><a name="_label7"></a></p><h2>spatie/browsershot</h2>
<p><a href="https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fspatie%2Fbrowsershot" rel="external nofollow"rel="external nofollow" target="_blank">browsershot</a> 是一个<code>composer</code>包,以前还用过的<a href="https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fspatie%2Flaravel-permission" rel="external nofollow" target="_blank">spatie/laravel-permission</a>,都是同一团队制作的</p>
<div><div class="jb51code"><pre class="brush:bash;">composer require spatie/browsershot
</pre></div></div>
<p class="maodian"><a name="_label8"></a></p><h2>使用</h2>
<p>其实困难的部分就是找到合适的工具以及安装工具,真正使用反而很简单。下面列了一个很简单的例子,更多方法还是去看<a href="https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fspatie%2Fbrowsershot" rel="external nofollow"rel="external nofollow" target="_blank">官方文档</a>吧。</p>
<div class="jb51code"><pre class="brush:php;"><?php
use Spatie\Browsershot\Browsershot;
class Spider
{
/**
* 获取html内容
* @param $url
* @return string
*/
public static function getBodyHtml($url)
{
return Browsershot::url($url)->bodyHtml();
}
}</pre></div>
<p class="maodian"><a name="_label9"></a></p><h2> 总结</h2>
頁:
[1]