背景
とある番組で、誕生花についての話をされていました。そのときに、ふと「誕生花が取得できるAPIを作ろう」と思い立ったので、その前段のお話。
アイデア
- 適当にどっかの誕生花が載ってるサイトを探す
- スクレイピングする
- CSVに出力する
- APIを作る
- CSVを元にPOSTする
- API叩いて誕生花取得
こんな感じでなんとかなるだろうと思いやってみました。この記事は1〜3までですね。
実装
今回はcheerio-httpcliを使いました。基本的に下記でできちゃいます。
scraping.js
var client = require('cheerio-httpcli');
var fs = require('fs');
// filename.csvの作成
fs.writeFile('filename.csv',"");
client.fetch('http://www.yourwebsite.jp', function (err, $, res) {
if (err) {
console.log(err);
} else {
// $にDOMが格納されているので、$をイジイジする
var mes = "CSVに, 出力したい, 内容\n";
fs.appendFile('filename.csv', mes, 'utf-8');
}
});
解説
スクレイピング
スクレイピングしたい場合は、あるタグとその子要素を取得したいことが多いと思います。例えば以下。
<div class="hoge">
<h3>fugafuga</h3>
<p class="pic">
<img></img>
</p>
</div>
<div class="hoge">
<h3>fugafuga</h3>
<p class="pic">
<img src="http~~"></img>
</p>
</div>
このような場合は以下のように書くと取得できます。
// divタグのclassがhogeのものを取得しそれぞれに対して処理を行う
$('div.hoge').each(function (idx) {
var temp = $(this);
var h3 = temp.find('h3').text();
var imgUrl = temp.find('p.pic > img').attr('src');
});
このように取得していき、順番にCSV出力するもよし、まとめて出力するもよしです。
CSV出力
これは超簡単ですね。今回はappendFileを利用しています。appendFileは追記になります。writeFileだと上書きされてしまいます。
まとめ
ものすごく便利なライブラリでした。一度使うノウハウを蓄えておくと、どのサイトでもスクレイピングできそうです。