2019-03-14 2019-04-05 技術

NodeでCheerioを使ってスクレイピング

スクレイピングをやったことが無かったが、軽く情報を取得したいということがあったので試しにNodeでスクレイピングしてみた。

目次

ライブラリの準備

今回はスクレイピングにcheerio-httpcliを使用する。
cheerioはてパースしたHTMLをjQueryのように操作できるライブラリで、cheerio-httpcliはそれを更に使いやすくしたもの。
ということでインストールする。今回はこれ以外は使わない。(必要に応じてlodash等は入れてもいいかもしれない。)

1
yarn add cheerio-httpcli

スクレイピング

使い方

大体 ここ を参考にした。

簡単な使い方だけ書いておく。

1
2
3
4
5
6
7
8
9
10
11
const httpClient = require('cheerio-httpcli');

const main = async () => {
// ベースURL。リクエストごとに変わらない部分
const baseUrl = 'https://hoge.fuga.com';

// HTMLデータを取得
const { $ } = await httpClient.fetch(baseUrl, { search: `foo`, category: 'bar' });
}

main();

画像のダウンロード

公式リファレンス を参考に。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs');
const client = require('cheerio-httpcli');

// ダウンロードマネージャーの設定(全ダウンロードイベントがここで処理される)
client.download
.on('ready', function (stream) {
stream.pipe(fs.createWriteStream('/path/to/image.png'));
console.log(stream.url.href + 'をダウンロードしました');
})
.on('error', function (err) {
console.error(err.url + 'をダウンロードできませんでした: ' + err.message);
})
.on('end', function () {
console.log('ダウンロードが完了しました');
});

// 並列ダウンロード制限の設定
client.download.parallel = 4;

const { $ } = await client.fetch(baseUrl, { search: `foo`, category: 'bar' });
// class="thumbnail"の画像を全部ダウンロード
$('img.thumbnail').download();

その他

スクレイピング以外で少しつまったことをまとめてみる。

URLオブジェクト

Nodeではクライアントjsで普通に使えるURLオブジェクトがデフォルトでは使えない。
使うにはrequire('url').URLとしないといけない。

excelとcsv

今回取得したデータは、csvにしてexcelで読み込むつもりだったが、普通のutf-8だと文字化けしてしまう。
なのでBOM(\uFEFF)をcsvファイルの先頭に追記することで読み込ませるようにした。

感想

スクレイピング自体は、参考文献が多くてそんなに苦労しなかったが、取得したHTMLから必要な情報を取得して整理するのがめちゃくちゃめんどくさかった。