LoginSignup
7
8

More than 5 years have passed since last update.

Node.jsでWebスクレイピングした内容をCSV出力

Posted at

背景

とある番組で、誕生花についての話をされていました。そのときに、ふと「誕生花が取得できるAPIを作ろう」と思い立ったので、その前段のお話。

アイデア

  1. 適当にどっかの誕生花が載ってるサイトを探す
  2. スクレイピングする
  3. CSVに出力する
  4. APIを作る
  5. CSVを元にPOSTする
  6. 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だと上書きされてしまいます。

まとめ

ものすごく便利なライブラリでした。一度使うノウハウを蓄えておくと、どのサイトでもスクレイピングできそうです。

7
8
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
7
8