スクレイピングとかSSR(サーバーサイドレンダリング)をしたい場合・・・
普通は nodejs の Phantom とか Puppetter とかを使うことが多いです。
でもとある事情で、どうしてもPHP側でスクレイピングがしたかったんです。
そこで見つけたのが PuPHPeteer というライブラリ
かなり便利でイイなと思ったので、
この PuPHPeteer の導入手順と使い方をまとめてみました。
このページの目次
まず PuPHPeteer の仕組みについて
名前の通り、これは node.js の Puppeteer を PHP から使えるようにしたやつ
Pupetter は "パペッター" と読むから、 PuPHPetter は "パピエイチペッター" みたいな読み方?
まあそれはともかく、Puppeteer は次の機能があるライブラリです。
- 画面のスクリーンショット取得
- DOMの取得・解析・書き換え
- 要素のクリックやスクロール
本当にサーバー側でDOM取得から何までできます。
なので構成が似ている商品ページやサービスのスクレイピングに便利ですね。
あとサーバーサイドレンダリング(いわゆるSSR)とかもできる模様
この Puppeteer をPHPから使えるのが PuPHPeteer というライブラリ
独立したものではなく、Pupeteer と PHP の橋渡し(ブリッジ)するためのもの です。
▼ なので次の点に注意が必要
- 使用には Puppeteer 本体が必要
- PuPHPeteer 単独では使えない
使用には node.js がいるので単独では使えません。
必ず node.js が使える環境を用意しとかないとダメ
PuPHPeteer の導入手順
それでは PuPHPeteer の導入手順を紹介
次のツーステップで導入できます。
1.node.js と Pupeteer のインストール
まず node.js の環境がないなら node.jsをインストール
その導入手順は次でまとめたので要チェック
node.js はサーバーも建てれるんですが、
今回はPHPを使うのでサーバーなんて大層なもの必要ありません。
そしたら npm から Puppeteer をインストール
1 |
npm install @nesk/puphpeteer |
ライブラリは node_modules ディレクトリ以下に配置されるはず
2.composerから PuPHPeteer をインストール
次は PuPHPeteer をインストール
コンポーザー(compsoer)を使ってインストするなら、次のコマンドを実行
1 |
composer require nesk/puphpeteer |
ただし php_sockets.dll は必ず有効化しておく必要あり
もし無効なら php.ini から extension=sockets の行をコメントインしておいてください。
早速 PuPHPeteer でマイブログのスクショを取ってみた
まず PuPHPPetter をいろいろ使って慣れてみることに、、、
その手始めとして自分のブログのスクショを取ってみました。
そのコード例は次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require_once 'vendor/autoload.php'; use Nesk\Puphpeteer\Puppeteer; $puppeteer = new Puppeteer(); $browser = $puppeteer->launch([ 'args' => ['--no-sandbox', '--disable-setuid-sandbox'] ]); $page = $browser->newPage(); $page->goto('https://pisuke-code.com/'); $page->screenshot([ 'path' => 'pisuke-code.com.png' ]); $browser->close(); |
大事なポイントは次の3つ
- まずブラウザを起動する
このコードの $pupeteer->launch(...); の部分。デフォルトだと動かなかったので、 --no-sandbox と --disable-setuid-sandobox を指定してる
- ブラウザから対象ページを開く
まず $browser->newPage(); でページオブジェクトを作成。そのあと $page->goto('https://...'); でページをレンダリングし、色々な処理ができる
- 最後にブラウザを閉じる
上記コードの $browser->close(); の部分
今回はスクリーンショットを取ってるだけ
でもスクショ以外にも、クリックイベントを起こしたり、スクロールさせたり、DOM要素の解析とかもできるみたいです。(まだ試してない)
あとそれから、このコードを動かすのに node.js でサーバーとか立てる必要ありません。
(というか node.js と Apache は共存できない)
ちなみに次が実際にとれたスクリーンショット
ちゃんと人間が見ているのと同じスクリーンショットが取得できました。
これはスクショ以外にも楽しいことができそう
ここまでのまとめ
PuPHPeteerを実際に使ってみたけど、かなり便利そうです。
スクショを撮る以外にも、サーバー側でDOM解析とかイベントを再現してアクセスしたいときに重宝するかもしれないので、いろいろ試したい気がします。
以上、PuPHPeteer の導入手順についてでした。