Puppeteerは、DevToolsプロトコルを使ってChromeやChromiumを操作するためのnode.jsのライブラリです。 ChromeやChromiumをヘッドレスで操作することもできます。
インストール
PuppeteerはNode.jsが必要です。Node.jsがインストールされていない場合は、以下を参考にインストールします。
npmで Puppeteer + Chrominum をインストールする場合は、パッケージ "puppeteer"をインストールします。 既にあるChromeを使用する場合など、ChrominumをインストールせずにPuppeteerだけインストールする場合、 パッケージ "puppeteer-core" をインストールします。
puppeteer + chrominum
Node.jsがインストールされているなら、npmコマンドでpuppetterをインストールします。
npm install puppeteer
例
$ npm install puppeteer > puppeteer@1.19.0 install /home/vagrant/tax/node_modules/puppeteer > node install.js Downloading Chromium r674921 - 112.6 Mb [====================] 100% 0.0s Chromium downloaded to /home/vagrant/tax/node_modules/puppeteer/.local-chromium/linux-674921 npm WARN saveError ENOENT: no such file or directory, open '/home/vagrant/tax/package.json' npm WARN enoent ENOENT: no such file or directory, open '/home/vagrant/tax/package.json' npm WARN tax No description npm WARN tax No repository field. npm WARN tax No README data npm WARN tax No license field. + puppeteer@1.19.0 added 28 packages from 21 contributors and audited 743 packages in 7.903s found 0 vulnerabilities
VirtualBoxやvagrantの仮想環境でインストールする場合、インストール先のディレクトリが共有ディレクトリだと、シンボリックリンク作成エラーが発生するケースがあります。 この場合は、オプション--no-bin-linksを付けたインストールを行います。
$ npm install puppeteer --no-bin-links参考
puppeteer のみ (puppeteer-core)
ChrominumをインストールせずにPuppeteerだけインストールする場合、puppeteer-coreをインストールします。
npm i puppeteer-core npm WARN saveError ENOENT: no such file or directory, open 'D:\develop\puppeteer\p-core\package.json' npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN enoent ENOENT: no such file or directory, open 'D:\develop\puppeteer\p-core\package.json' npm WARN p-core No description npm WARN p-core No repository field. npm WARN p-core No README data npm WARN p-core No license field. + puppeteer-core@3.2.0 added 47 packages from 74 contributors and audited 47 packages in 3.204s 3 packages are looking for funding run `npm fund` for details found 0 vulnerabilities
動作確認
インストールが成功したら、以下のようなファイルを作成して動作テストします。
const puppeteer = require('puppeteer'); const options = { args: [ "--no-sandbox" ] }; var url = 'https://www.example.com/'; var savePath = "test_image.png"; (async () => { const browser = await puppeteer.launch(options); const page = await browser.newPage(); await page.goto(url); await page.screenshot({path: savePath}); await browser.close(); })();注意 asyncとawaitがデフォルトでサポートされたのは、Node.js バージョン 7.6です。
上記ファイルをtest.jsとすると、以下のように実行します。
node test.jsスクリーンショットの画像test_image.pngが正常に作成されていたらOKです。
注意 optionsで、--no-sandboxを指定していますが、これは以下のエラー対応のためです。 このオプション無しでエラーが発生しない場合、これを指定する必要はありません。
トラブル
参考
sandboxエラー
実行したときに、以下のようなエラーが発生する場合
$ node test.js (node:4436) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome! [0816/222903.262656:FATAL:zygote_host_impl_linux.cc(116)] No usable sandbox! Update your kernel or see https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the SUID sandbox. If you want to live dangerously and need an immediate workaround, you can try using --no-sandbox. #0 0x7fb8542a1a99 base::debug::CollectStackTrace() #1 0x7fb8542023e3 base::debug::StackTrace::StackTrace() #2 0x7fb854216943 logging::LogMessage::~LogMessage() ... #10 0x7fb848be4b15 __libc_start_main #11 0x7fb851c9302a _start Received signal 6 #0 0x7fb8542a1a99 base::debug::CollectStackTrace() #1 0x7fb8542023e3 base::debug::StackTrace::StackTrace() .... #15 0x7fb848be4b15 __libc_start_main #16 0x7fb851c9302a _start r8: 0000000000000000 r9: 0000000000000000 r10: 0000000000000008 r11: 0000000000000206 r12: 00007ffd1db97968 r13: 00007ffd1db96948 r14: 00007ffd1db97970 r15: 00007ffd1db97978 di: 000000000000115f si: 000000000000115f bp: 00007ffd1db968f0 bx: 00007ffd1db96948 dx: 0000000000000006 ax: 0000000000000000 cx: ffffffffffffffff sp: 00007ffd1db967b8 ip: 00007fb848bf85f7 efl: 0000000000000206 cgf: 0000000000000033 erf: 0000000000000000 trp: 0000000000000000 msk: 0000000000000000 cr2: 0000000000000000 [end of stack trace] Calling _exit(1). Core file will not be generated. TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md ....
起動オプションに、--no-sandbox を指定すれば回避できる可能性があります。
const puppeteer = require('puppeteer'); const options = { args: [ "--no-sandbox" ] }; const browser = await puppeteer.launch(options); ...
ライブラリ不足のエラー
実行時に以下のようなlibXXXXXのエラーが出る場合、ライブラリが不足しているので、必要なライブラリのインストールが必要です。
error while loading shared libraries: libXXXXX: cannot open shared object file: No such file or directory
詳細は以下