COMPANY SERVICE STAFF BLOG NEWS CONTACT

STAFF BLOG

スタッフブログ

TECHNICAL

テクログ

2022.09.13

Puppeteerを試してみた

テクログ

お久しぶりです。

JGです。

前回はSeleniumを紹介しましたが、今回はPuppeteerを試してみたので、 Puppeteerについて簡単に説明したいと思います。

概要

Puppeteerは一言で表現すると、ブラウザでのテストを自動化できるツールです。

Seleniumは様々なプログラミングに対応していますが、PuppeteerはJavaScriptのみ対応しています。

環境構築

Windowsの手順しか書いておりませんが、Macも似たような手順だと思います。

下記の手順で簡単に環境ができると思います。

1.Node.jsをインストール
2.コマンドプロンプトで下記を実行
npm install puppeteer

指定したURLを起動する方法

ここからは Puppeteerでできることを紹介していきます。

Puppeteerのバージョンは15.3.2で書いています。

コピペ通りで動くはずです。

ignoreHTTPSErrorsは自己証明書が求められるページで必要になります。

Puppeteerはデフォルトでヘッドレスで実行されるので、 GUIを表示したい場合はheadlessをfalseにする必要があります。

const puppeteer = require('puppeteer');

(async () => {
    // ignoreHTTPSErrorsを指定しないと自己証明書を求められるページではエラーになる
    const browser = await puppeteer.launch({headless: false, ignoreHTTPSErrors: true});
    const page = await browser.newPage();

    try {
        // 指定したURLを起動する    
        await page.goto('https://www.yahoo.co.jp/');
    } catch (err) {
        console.log(err.message);
    } finally {
        // ブラウザを閉じる    
        await browser.close();
    }
})();

コンソールを表示する方法

ブラウザのコンソールの内容を表示する方法です。

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({headless: false, ignoreHTTPSErrors: true});
    const page = await browser.newPage();

    try {
        // コンソールエラーを表示
        page.on('console', msg => {
             const type = msg.type();
             const text = msg.text();
             if (type === 'error' || type === 'warning') {
                 console.log(text);
             }
        });

        // 指定したURLを起動する
        await page.goto('https://www.yahoo.co.jp/');
    } catch (err) {
        console.log(err.message);
    } finally {
        // ブラウザを閉じる
        await browser.close();
    }
})();

ログインする方法

IDとパスワードを入力して、ログインする方法です。

page.typeで入力し、page.clickでボタンをクリックします。

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({headless: false, ignoreHTTPSErrors: true});
    const page = await browser.newPage();

    try {
        // コンソールエラーを表示
        page.on('console', msg => {
             const type = msg.type();
             const text = msg.text();
             if (type === 'error' || type === 'warning') {
                 console.log(text);
             }
        });

        // 指定したURLを起動する
        await page.goto('https://login.yahoo.co.jp/config/login?.src=www&.done=https://www.yahoo.co.jp/');

        // IDを入力
        await page.type('#username', 'id');
        
        // 次へボタンをクリック
        await Promise.all([
            page.waitForNavigation({waitUntil: 'load'}),
            page.click('#btnNext'),
        ]);
        
        // パスワードを入力
        await page.type('#passwd', 'password');
        
        // ログインボタンをクリック
        await Promise.all([
            page.waitForNavigation({waitUntil: 'load'}),
            page.click('#btnSubmit'),
        ]);
    } catch (err) {
        console.log(err.message);
    } finally {
        // ブラウザを閉じる
        await browser.close();
    }
})();

スマホでアクセスする方法

スマホでアクセスする方法ですが、puppeteer.devicesに端末名を指定するようです。

const puppeteer = require('puppeteer');
// スマホでアクセスする設定
const device = puppeteer.devices['iPhone 13'];

(async () => {
    const browser = await puppeteer.launch({headless: false, ignoreHTTPSErrors: true});
    const page = await browser.newPage();
    await page.emulate(device);

    try {
        // コンソールエラーを表示
        page.on('console', msg => {
             const type = msg.type();
             const text = msg.text();
             if (type === 'error' || type === 'warning') {
                 console.log(text);
             }
        });

        // 指定したURLを起動する
        await page.goto('https://www.yahoo.co.jp/');        
    } catch (err) {
        console.log(err.message);
    } finally {
        // ブラウザを閉じる
        await browser.close();
    }
})();

スクショをとる方法

スクショをとる方法です。

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({headless: false, ignoreHTTPSErrors: true});
    const page = await browser.newPage();

    try {
        // コンソールエラーを表示
        page.on('console', msg => {
             const type = msg.type();
             const text = msg.text();
             if (type === 'error' || type === 'warning') {
                 console.log(text);
             }
        });

        // 指定したURLを起動する
        await page.goto('https://www.yahoo.co.jp/');

        const now = new Date();
        const year = now.getFullYear();
        const month = now.getMonth() + 1;
        const date = now.getDate();
        const hour = now.getHours();
        const min = now.getMinutes();
        const sec = now.getSeconds();
        const now_datetime = year + '_' + month + '_' + date + '_' + hour + '_' + min + '_' + sec;

        // スクショをとる
        // このファイルと同じ階層にimagesフォルダを作成済みでないとエラーになるので注意
        await page.screenshot({path: './images/image_'+now_datetime+'.png', fullPage: true});
    } catch (err) {
        console.log(err.message);
    } finally {
        // ブラウザを閉じる
        await browser.close();
    }
})();

スクレイピングの方法

最後はスクレイピングの方法です。

const puppeteer = require('puppeteer');

(async () => {
    // GUIを表示しないヘッドレスモードにする場合はheadless: falseを指定しない
    const browser = await puppeteer.launch({ignoreHTTPSErrors: true});
    const page = await browser.newPage();

    // スクレイピングするURLの一覧
    const urls = [
        'https://www.yahoo.co.jp/',
        'https://www.google.com/'
    ];

    for (const url of urls) {
        try {
            // コンソールエラーを表示
            page.on('console', msg => {
                 const type = msg.type();
                 const text = msg.text();
                 if (type === 'error' || type === 'warning') {
                     console.log(url, text);
                 }
            });

            const response = await page.goto(url);
            // レスポンスコードを取得
            if (response.status() != 200) {
                console.log(url, 'status', response.status());
            }

            // スクショをとる
            await page.screenshot({path: './images/image_'+get_now_datetime()+'.png', fullPage: true});

        } catch (err) {
            console.log(err.message);
        }
    }
    // ブラウザを閉じる
    await browser.close();
})();

function get_now_datetime() {
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const date = now.getDate();
    const hour = now.getHours();
    const min = now.getMinutes();
    const sec = now.getSeconds();
    return year + '_' + month + '_' + date + '_' + hour + '_' + min + '_' + sec;
}

最後に

ざっと簡単にPuppeteerについて紹介しました。

Puppeteerについて興味を持ったかたは、是非試してみてください。

この記事を書いた人

JG

入社年2020年

出身地神奈川県

業務内容プログラム

特技・趣味サッカー観戦

テクログに関する記事一覧

TOP