12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SLP KBITAdvent Calendar 2018

Day 22

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

Last updated at Posted at 2018-12-21

##はじめに
この記事は 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チックにコードを書けるので、比較的楽にスクレイピングすることが出来たと思います。(問題は静的ページのみなところ)
今回は静的ページをスクレイピングしたので、今度は動的ページのスクレイピングに挑戦したいです。

##参考

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?