
Puppeteer製リンクチェッカー
Web制作でリンクチェッカーはdead-link-checker.comがよく使用されているがチェックの速度が遅く、細かいカスタマイズなどができないなどのデメリットがある。
そこでオススメしたいのがPuppeteerを使用したリンクチェッカーだ。
PuppeteerとはChromeまたはChromiumを制御するためのNodeライブラリ。
これを使用すれば各aタグのリンクのステータスコードを取得できるため、リンクのチェックを行うことができる。
リンクチェッカーの作成手順
まずNode.jsを使用するのでインストールしていなければ推奨版をインストールする。
次に以下のコマンドで適当なディレクトリを作成してlc.jsを作成する。(js名は任意)
mkdir link-checker; cd link-checker; touch lc.js; npm init -y; npm i -D puppeteer colors;
最後に以下のコードをlc.jsに貼り付けて保存すれば node lc.js [url] のコマンドでリンクチェックが可能になる。
※ page.setJavaScriptEnabled (JS無効化) はサイトによっては削除
console.log('リンクチェック開始');
const puppeteer = require('puppeteer');
const colors = require('colors');
const DCL = { waitUntil: 'domcontentloaded' };
const url = process.argv[2];
let urls = [];
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.goto(url, DCL);
await page.setJavaScriptEnabled(false);
const a = await page.$$('a');
let urls = new Set();
for (let link of a) {
const a = await link.getProperty('href');
const href = await a.jsonValue();
if (!/^(#|javascript|mailto|tel|.+(facebook|twitter)\.com\/share.*)/.test(href) && !/\.pdf$/.test(href) && href) {
urls.add(href.split('#')[0]);
}
}
let len = urls.size;
const errors = [];
for (const url of urls) {
const res = await page.goto(url, DCL);
const result = len-- + '/' + urls.size + ' ' +
res._status + ' ' +
res._url;
if (res._status >= 400) {
errors.push(result);
console.log(colors.red(result));
} else if (/^http:.+/.test(res._url)) {
console.log(colors.yellow(result));
} else {
console.log(result);
}
}
if (errors.length) {
console.log(colors.red(`${errors.length}個のエラーを検出しました。`));
console.log(errors.sort((a, b) => a > b).join('\n'));
} else {
console.log('エラーはありませんでした。')
}
await browser.close();
});
node lc.js https://www.disney.co.jp/