darudaru

だるだるしてるエンジニア

Node.jsでサクっとWebスクレイピングをする

私用でGithubの絵文字チートシート*1から絵文字の一覧を取得したかったのですが、良さげなツールがなかったのでWebスクレイピングで絵文字を引っこ抜くことにしました。

一応、Webスクレイピングの説明

Webサイトから情報を抽出する技術のことを指します。
Webサイトの規約に反する可能性もあるので、使用には十分気をつける必要があります。

また、Webスクレイピングの対象のWebサイトのDOM構造が変わると、Webスクレイピングのプログラムも追従して改修する必要が出てきて運用コストがかかってしまいます。WebサイトからAPIなどの提供があるならそちらを使用することをオススメします。

以上を踏まえて実践

Node.jsのcheerio-httpcliというモジュールを使います。DOMをjQueryライクに操作できます。
READMEが日本語なので、英語が苦手な人も安心。

www.npmjs.com

インストール

$ npm i --save cheerio-httpcli

使い方

const client = require('cheerio-httpcli');
const p = client.fetch('https://www.webpagefx.com/tools/emoji-cheat-sheet/')
        .then((result) => {
            // HTMLタイトルを表示
            console.log(result.$('title').text());
        });

これだけ。client.fetchの第1引数にWebスクレイピング対象のURLを指定します。簡単ですね。
Promise形式で書きましたが、callback関数ももちろん使えます。

const client = require('cheerio-httpcli');
client.fetch('https://www.webpagefx.com/tools/emoji-cheat-sheet/', (err, $, res, body) => {
   // HTMLタイトルを表示
  console.log($('title').text());
});

まとめ

cheerio-httpcliのインストールからプログラムを完成させるまで、数時間でできちゃいました。jQueryに慣れていないので、DOMの指定の仕方に一番戸惑って時間がかかったくらい。
ちなみに最初はPHPのphpQueryでWebスクレイピングをしようとしたのですが、だいぶ昔に作成されたツールでしばらくメンテナンスもされていないようなので、使うのをやめました。

というわけでWebスクレイピングで絵文字を全部引っこ抜いて、jsonで取得できるようにしたツールがこちらです。

github.com

よければお使いください。