情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでhttp(s)を使ってWebページをスクレイピングする

WebページをスクレイピングするにはWebサイトからWebページのテキストデータを取得し、取得したテキストデータをHTMLドキュメントとしてDOMを構築し、所望のデータを取得しなければなりません。

これには下のようなモジュールを利用する方法があります。

  • http(s)
  • request
  • cheerio-httpcli

この記事ではhttp(s)モジュールを利用する方法を取り上げます。


http(s)モジュールを使ってWebサイトからテキストデータを取得する方法に関しては下の記事を参照してください。

DOMを使用するには下のようなモジュールを利用する方法があります。

  • jsdom
  • cheerio

DOMを使用する方法に関しては下の記事を参照してください。


これらを組み合わせることにより、Webページをスクレイピングすることができます。

サンプルコード1

cheerioモジュールを利用する例です。

3つ目のコマンドライン引数として与えられたURLからテキストデータを取得し、取得したテキストデータをHTMLドキュメントとしてDOMを構築し、HTMLドキュメントの全てのリンクのURLを取得し、標準出力に出力します。

URLに応じてhttpモジュールとhttpsモジュールの何れか適切なものを使用します。

取得したデータの文字コードがiconv-liteモジュールがサポートしていないものである場合にはエラーとします。

なお、ストリームの処理のためにconcatStream関数とpump関数を使用しています。

http-cheerio-scrape.js

var url = require('url');
var http = require('http');
var https = require('https');
var concatStream = require('concat-stream');
var mimelib = require('mimelib');
var jschardet = require('jschardet');
var iconvLite = require('iconv-lite');
var cheerio = require('cheerio');
var pump = require('pump');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

var client = (url.parse(process.argv[2], false).protocol === 'https:' ? https : http).get(process.argv[2], function (res) {
    if (res.statusCode === 200) {
        var writable = concatStream(function (data) {
            var encoding = undefined;
            if (res.headers['content-type'] !== undefined) {
                encoding = mimelib.parseHeaderLine(res.headers['content-type']).charset;
            }
            if (encoding === undefined) {
                encoding = jschardet.detect(data).encoding;
            }
            if (encoding !== undefined && iconvLite.encodingExists(encoding)) {
                var $ = cheerio.load(iconvLite.decode(data, encoding));
                $('a').each(function (i, elem) {
                    console.log($(elem).attr('href'));
                });
            }
            else {
                console.error('can\'t detect encoding.');
                process.exit(1);
            }
        });
        pump(res, writable, function (err) {
            if (err) {
                console.error(err);
                process.exit(1);
            }
        });
    }
    else {
        console.error('can\'t process.');
        process.exit(1);
    }
});
client.setTimeout(10000, function () {
    console.error('timeouted.');
    client.abort();
});
client.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

使用パッケージ

  • concat-stream
    npm install concat-streamでインストールします。
  • mimelib
    npm install mimelibでインストールします。
  • JsChardet
    npm install jschardetでインストールします。
  • Pure JS character encoding conversion
    npm install iconv-liteでインストールします。
  • cheerio
    npm install cheerioでインストールします。
  • pump
    npm install pumpでインストールします。

実行結果

C:\work\node>node http-cheerio-scrape.js http://www.hai-furi.com/
/news/?article_id=38260
/news/
/
/news/
/story/
/staff-cast/
/onair/
/character/
/ships/
/music/
/bd-dvd/
/radio/
/goods/
/movie/
/app/
/special/
https://twitter.com/hai_furi
https://youtube.com/watch?v=-80xmmuMIxk%3Frel%3D0%26autoplay%3D1
https://youtube.com/watch?v=-80xmmuMIxk%3Frel%3D0%26autoplay%3D0
bd-dvd/
http://live.nicovideo.jp/gate/lv259299719
/special/report_kurama/
/music/charasong/index.html
/app/
/special/present_02/
/onair/
./news/?article_id=38260
./news/?article_id=38248
./news/?article_id=38236
./news/?article_id=38251
./news/?article_id=38237
https://twitter.com/hai_furi
/
/news/
/story/
/staff-cast/
/onair/
/character/
/ships/
/music/
/bd-dvd/
/radio/
/goods/
/movie/
/app/
/special/
https://twitter.com/hai_furi
http://twitter.com/share?url=http%3A%2F%2Fwww.hai-furi.com%2F&text=TV%E3%82%A2%E3%83%8B%E3%83%A1%E3%80%8C%E3%83%8F%E3%82%A4%E3%82%B9%E3%82%AF%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%95%E3%83%AA%E3%83%BC%E3%83%88%E3%80%8D%E5%85%AC%E5%BC%8F%E3%82%B5%E3%82%A4%E3%83%88&hashtags=%E3%81%AF%E3%81%84%E3%81%B5%E3%82%8A
http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.hai-furi.com%2F
http://www.aniplex.co.jp/support/user.html
http://www.aniplex.co.jp/help/site.html
http://www.aniplex.co.jp/help/privacy.html
http://www.aniplex.co.jp/
/
http://www.mediafactory.co.jp/comic-alive/
http://www.aniplex.co.jp/

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js