Puppeteerシリーズで特定のジャンルで需要がありそうなのが「定期的に実行」系。しかし、通常のPuppeteerでは一回実行して完了したらそれで終了です。この定期実行は、特定サイトのデータを定期的にCSVでダウンロードしておくであったり、また、特定サイトの情報を定期的にスクレイピングなど、使い所は結構あります。

今回はGoogle Mapsの特定のポイントのスクリーンショットを定期的に取得するタイプのものを作ってみました。xlsxに記述したURLを取り込み、10分毎にそれらのスクショを撮るというものです。

※保存場所をGoogle Drive File Streamの場所に指定すれば、Google Driveへのアップロードも自動化になるので、Google Apps Scriptでスクレイピングするよりずっと効果的だと思います。

難易度:

今回使用するモジュール等

今回は定期的にpuppeteerを起動させるためにNode-Cronを必要としています。これで10分置きに、xlsxファイルを読み取って、サイトへ移動しながら、スクリーンショットを取り続けるプログラムです。また、Excelデータを読み込ませるためのモジュールも必要です。

今回の操作上の問題点

今回の要件は、特定サイトのスクショを定期的に取り続けることなので、

  • リストになるxlsxファイルを必要とし、
  • また、定期的に実行するので、Cronが必要になります。

過去にもNode.jsでNode-Cronを取り扱ったことがありましたが、そのままPuppeteerでも利用し、10分置きにスクリーンショットをバンバン撮っていくスタイルなので、自分でコマンドプロンプトを閉じない限り稼働し続けます。

また、ファイル名で利用する日付の生成ですが、getFullYearなどとやってると面倒なので、今回よりdate-utilsモジュールを使って、new Date()を拡張するようにしました。

図:こんな感じでファイルが生成され続ける

URLリスト用のExcelファイルについて

URLリストを記述しておくExcelファイルは単純な構成で、シート名は登録リストとし、IDと場所名、Google MapsのURLを入れてあります。このIDと取得時の日時でファイル名を設定し、バンバン取得していく感じになります。

デスクトップに配置し、同じくデスクトップにsnapshotフォルダを作っておきましょう。

図:IDは連番で振ります

ソースコード

冒頭部分

  • date-utilsモジュールはrequireするだけでnew Date()を拡張してくれるので、変数等に格納は不要です。
  • snapshot用のディレクトリ、xlsxファイルの指定等は決め打ちです。
  • xlsx-populate-wrapperにて、xlsxデータをJSONで取得し操作するようにしています。
  • cronTimeにて上記のコードのように指定すると10分置きに実行という指定になります。最後にCronJob.scheduleでmain()を指定すれば、起動してスクショ撮って閉じるが定期的に実行されます。

Puppeteer部分

  • 今回は10分置き実行なので、その度にChromeが表示されると鬱陶しいので、headlessオプションはtrueとしてヘッドレスモードで実行させています。
  • xlsxデータを回して、URLを取り出し移動。日付にてファイル名を設定しスクショを撮って保存を繰り返します。
  • 最後にブラウザを閉じる。閉じてもプログラムが終了するわけではないので、手動でCtrl+x実行か?プロンプトを手動で閉じれば止まります。
  • page.screenshotにて簡単にスクショは取得できる。filenameはフルパスを指定します。

ダウンロード

今回作成したPuppteerをnexeでEXE化しました。Google Mapsの特定のポイントを巡回してスクリーンショットを取り続けるプログラムになるので、ダブルクリックのみで稼働し続けます。終了したいときはコマンドプロンプトを閉じればOK。事前にデスクトップに以下のファイルの中にあるlist.xlsxとsnapshotフォルダを配置しておく必要があります。

もちろん、事前にChromeをインストールしておく必要性があります

ファイルのダウンロード

関連リンク

共有してみる: