NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

簡単3ステップ!Puppeteerによるスクショ取得自動化実践

f:id:tmktkg:20211216110944p:plain

本記事はNRIネットコム Advent Calendar 2021 19日目の記事です。
🎄 18日目 ▶▶ 本記事 ▶▶ 20日目 🎅

はじめまして、Webディレクター/フロントエンドエンジニアの高木です。

今回はヘッドレスブラウザ*1「Puppeteer」を使ったスクリーンショット取得自動化についてご紹介します。
少しの手間で大きな時短になるので、ぜひお試しください!

この記事について

背景

Webディレクターの業務の中では、既存サイトの整理を行うことがままあると思います。
先日、「サイト全体のパーツを棚卸ししたい。その際に全パーツのスクリーンショットが必要」というケースがあり、Puppeteerを利用することでスピーディーに対応することができました。
これを受けて、ぜひみなさんにもご紹介したい!と思った次第です。

対象読者

こんな悩みをお持ちの方

  • 手動スクショ辛すぎる😱
    サイト全ページのスクリーンショットを自動で取得したい!
  • 同じ操作するの辛すぎる😱
    特定の操作をしたときのスクリーンショットを自動で取得したい!
  • トリミング作業辛すぎる😱
    特定の要素をトリミングした状態でスクリーンショットを取得したい!

必要環境

  • Node.js
    • JavaScirpt実行環境
    • インストール方法は公式インストーラ/nodenv/nvmなどがありますが、ここでは割愛します
  • Puppeteer
    • Googleが開発しているヘッドレスブラウザ

環境の準備

1.作業ディレクトリを作り、その直下へ移動します。
npm init実行後、いろいろと聞かれますがすべてEnterキーを押します。

$ cd 作業フォルダ
$ npm init

2.npm*2を使って、Puppeteerをインストールします。

$ npm install puppeteer

使い方(基礎編)

サイト全ページのスクリーンショットを取得する

1.JSON形式でURL一覧を作成します。取得対象を増やす場合はurl, saveFileNameを追加してください。*3

f:id:tmktkg:20211215170404p:plain

[{
    "url": "https://www.nri-net.com/company/profile/",
    "saveFileName": "profile"
}]

2.Puppeteerを操作するために、JavaScriptファイルを用意します。

f:id:tmktkg:20211215170341p:plain

const puppeteer = require('puppeteer');     //Puppeteerの定義
const urlList = require('./urlList.json');   //URL一覧の読み込み

(async () => {
    //ブラウザ起動
    const browser = await puppeteer.launch({ headless: true });
    //タブ展開
    const page = await browser.newPage();
    //Viewportの設定
    await page.setViewport({ width: 1080, height: 768 });
    for (key in urlList) {
        //ページ遷移
        await page.goto(urlList[key].url, { waitUntil: 'networkidle2' });
        //スクリーンショットの取得と保存
        await page.screenshot({ path: urlList[key].saveFileName + '.png', fullPage: true });
    }
    await browser.close();
})();

3.JavaScriptを実行すると、同じ階層にスクリーンショットが保存されます。

$ node getPageScreenshot.js

取得したスクリーンショット

ワンポイントアドバイス
lazyloadやパララックスを採用している場合、スクリーンショット取得時に要素が空白になってしまいます。
これを防止するために、スクロールイベントを発生させる方法があります。"puppeteer screenshot scroll"などのキーワードで検索してみると参考記事が見つかります。

使い方(応用編)

特定の操作をしたときのスクリーンショットを取得する

遷移(page.goto)のあと、処理を挿入することでページ遷移後に任意の操作が実行できます。
代表的な例を以下に示しますが、他にもChromeでできる操作はすべて実行可能です。

特定の要素をトリミングした状態でスクリーンショットを取得する

遷移のあと、セレクタを指定することで特定の要素のみスクリーンショットを取得できます。

const selector = await page.$('セレクタ');
await selector.screenshot({ path: 'ファイル名.png' });

注意事項

自動化ツールを使うと、簡単に大量のページにリクエストを飛ばすことができます。…が、大量のリクエストを受けたサーバ側は高負荷になってしまいます。

大量のリクエストが必要な場合は、ローカル環境に資材を配置して対応しましょう。

終わりに

Puppeteerは有名なヘッドレスブラウザですが、コーディングが苦手な方にとっては少し敷居が高いツールなのかなと思います。
そういった方々に「こんなに簡単に自動化できるんだ!」と感じていただけたら嬉しいです。
単純作業に割く時間が少しでも減り、クリエイティブな活動をする時間が増えますように…

執筆者高木 智子

Webディレクター/フロントエンドエンジニア

NRIネットコム Advent Calendar 2021
🎁 18日目 ▶▶ 本記事 ▶▶ 20日目 🍰

*1:プログラムから操作できる、UIを持たないブラウザのこと

*2:Node.js付属のパッケージ管理ツール

*3:今回はコード簡略化のためにスクリーンショット保存時のファイル名(saveFileName)を個別に定義