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

詳細は以下