チカラの技術

電子工作やプログラミング

PuppeteerをRaspberry Piで使う

※注記:本記事の方法で動くようになりますが、一部APIでエラーが起こる事を確認しています。
    (回避策有り)

概要

Puppeteerはchromium-browserを制御するNode.jsのライブラリで、これを使用すればjavascriptやフォームをまたいで遷移するwebページのテストやスクレイピングができます。

ただし、Raspberry Piでインストールできるchromium-browserは バージョンやCPU依存の関係で普通にインストールしても動きません。

今回、ググって試行錯誤して一応動作するところまで行きましたので手順を残します。 (ただ、冒頭で述べたように一部APIが動作しない症状がありますので回避策も含め後述します)

インストール手順

① まずchromium-browserをインストールします。
  現在ver 65.0がインストールされます。

sudo apt-get install chromium-browser

② バージョンを指定してPuppeteerをインストールします。
 (最新の1.7.0では起動時にエラーが発生するため)

npm install puppeteer@1.6.2

③ Puppeteerを使用するソースコードの、puppeteer.launch関数の中で
  先ほどインストールしたchromium-browserのディレクトリを指定します。
  (デフォルトのchromium-browserはnpm install puppueteerの依存としてインストールされるが、
   これはx86用バイナリでRaspberryPIでは動作しないため。)

const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
  headless: true,
  executablePath: '/usr/bin/chromium-browser'
});

以上です。

正常に動作しないAPIもある

残念ながら最新バージョンではないため、一部のAPIは正常に動作しないようです。

私が遭遇した例を挙げます。
以下の箇所でエラーが発生しました。 (Windows環境では正常動作しています)

await page.click(".search-button");

エラーメッセージは以下の通り   f:id:powerOfTech:20180816220107p:plain

上記は、以下のAPIに書き換える事で動作しました。

await page.evaluate(() => {
  document.querySelector(".search-button").click();
  });

page.evaluate()の引数の関数で実行するjavascriptは、ブラウザ内で実行するのと等価になります。
他のAPIが動かなかったときも同様に動く可能性がありますので試してみる価値はあると思います。

終わりに

以上、ワークアラウンドでした。
もし同様に動作しないAPIやその回避策が有ればコメントで情報頂けると助かります。
以上よろしくお願いします。

参照にさせて頂いたページ

qiita.com

なお、以下のページでchromium-browser@68.0をダウンロードしてインストールするやり方では
puppeteer@1.7.0は動作しませんでした。
https://launchpad.net/~canonical-chromium-builds