Help us understand the problem. What is going on with this article?

Node.jsでスクレイピング(cheerio-httpcli)

More than 1 year has passed since last update.

はじめに

この記事は SLP KBIT Advent Calender 2018 22日目の記事です。

前々からスクレイピングに興味があったので、Node.jsを使ってスクレイピングをしてみることにしました。
今回は、Node.js用Webスクレイピングモジュールであるcheerio-httpcliを使用してみます。
完全に初心者なので、間違っているところがありましたら教えていただけると嬉しいです。

cheerio-httpcliについて

cheerio-httpcliとは、Node.jsを使ってWebページをスクレイピングする際に必要となる文字コードの変換、そして、cheerioによってパースされたHTMLをjQueryのように操作することが出来るモジュールです。

ここで注意しなければならないのは、静的ページにしか対応していないので、Javascriptなどによってコンテンツを取得するページには使えないことです。
なので、動的ページをスクレイピングする時は、別のモジュールを使用するようにしましょう。(調べたらCasperJSなどがありました)

使ってみた

Googleで私が所属しているSLP KBITのホームページを検索をしてみます。
今回は、SLP KBITを検索ワードとして検索しました。

const client = require('cheerio-httpcli');

var word = 'SLP KBIT';

client.fetch('http://www.google.com/search', { q: word })
    .then((result) => {
        console.log(result.$('title').text());
        result.$('a').each(function (idx) {
            var $h3text = result.$(this).find('h3').text();
            var $url = result.$(this).attr('href');
            if ($h3text.includes('slp-kbit')) {
                console.log($h3text + '  '  + $url);
            }
        });
    })
    .catch((err) => {
        console.log(err);
    })
    .finally(() => {
        console.log('終了');
    });

プロミス形式でも書けるとあったので、今回はそちらで書いてみました。(悪くない)

使用する時はcheerio-httpcliのインストールを忘れずに。

npm install cheerio-httpcli

実行結果はこんな感じです。

実行結果
SLP KBIT - Google 検索
slp-kbit - 香川大学  https://poulenc.eng.kagawa-u.ac.jp/Pub/KBIT/
終了

成功です。(やったね)

少し解説(fetchメソッドについて)

今回書いたコードでcheerio-httpcliのメソッドであるfetchメソッドについて説明していきたいと思います。

client.fetch('http://www.google.com/search', { q: word })

この部分ですね。
これは、cheerio-httpcliのfetchメソッドを使用しています。
fetchメソッドとは、urlで指定したページをgetメソッドで取得します。その後、文字コードの変換やHTMLパースを行っているのですが、要はurlを指定してそのソースの解析をし、情報を取っているという事ですね。

今回私はプロミス形式で呼び出しましたが、callback関数に返すことも出来ます。(サンプルではcallback関数を使用してました)
callbackを使用する時は以下のように書きます。

client.fetch('url', {q: word}, function (err, $, res, body) {
    //やりたい処理
});

引数のcallback関数を省略すると、自動的にPromiseオブジェクトが返るようになっています。
なので、プロミス形式で書くときは、callback関数を省略するだけでOKです。
ただし、プロミス形式でthenに渡されるパラメータは1つの引数にまとめられているという点には注意が必要です。(callbackでは引数が4つ)

titleタグのテキストを呼び出すときの違い
    $('title').text();  //callback関数の場合
    result.$('title').text();  //プロミス形式の場合(thenの引数をresultとしている)

このように呼び出すときには間違えないように注意しましょう。

おわりに

「cheerio-httpcliを使ってこんなことが出来る!」という事を書きたかったのですが、ちょこっと触った程度なのでいい案が出ませんでした。(アイディア力の無さ)
cheerio-httpcli自体はjQueryチックにコードを書けるので、比較的楽にスクレイピングすることが出来たと思います。(問題は静的ページのみなところ)
今回は静的ページをスクレイピングしたので、今度は動的ページのスクレイピングに挑戦したいです。

参考

tokutatsu
大学生です。 主にNode.jsを書いてる人。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした