読者です 読者をやめる 読者になる 読者になる

もやもやエンジニア

IT系のネタで思ったことや技術系のネタを備忘録的に綴っていきます。フロント率高め。

Node.jsで超簡単にスクレイピングを実装してみる

JavaScript スクレイピング Node.js

スクレイピングとは

Webスクレイピングとは、WebサイトからWebページのHTMLデータを収集して、特定のデータを抽出、整形し直すことである。

http://www.sophia-it.com/content/Webスクレイピング

よそ様のサイトのHTMLから情報を取得・解析して必要なデータを取得するという手法ですね。使用上の注意としてはページの内容をまるごと抽出してコピーサイトを作ったり、過剰にアクセスをして取得先のサーバーに負荷をかけるようなことはやめましょう。すんごい数のリクエストを投げたらDDoS攻撃と変わらなくなってしまいます。

Node.jsで実装してみる

だいたいJavaでもRubyでもPHPでもスクレイピング用のライブラリが用意されているようですが、今回はNode.jsで実装します。
今回はサンプルなのでこのブログの去年の記事一覧から記事タイトルをひっぱってみます。

スクレイピングで使用するライブラリはcheerio-httpcliを使ってみます。このライブラリはもともとcheerioというHTMLをjQueryライクにパースするモジュールにrequestやiconvなどスクレイピングするのに必要なモジュールを組み込んだパッケージです。

では実装してみます。

何はともあれpacakge.jsonにnpmを追加

pacakge.json

{
  "name": "scraping_sample",
  "version": "0.0.1",
  "description": "scraping sample",
  "author": "Rei Matsushita",
  "license": "MIT",
  "dependencies": {
    "cheerio-httpcli":"*"
  }
}

ほんでインスコ

$ npm install

んでんで実装側

app.js

// モジュール読み込み
var client = require('cheerio-httpcli');

// スクレイピング開始
client.fetch('http://rei19.hatenablog.com/archive/2013', {}, function (err, $, res) {

  // 記事のタイトルを取得
  $('.entry-title-link').each(function() {
    console.log($(this).text());
  });

});

実装部分はこれだけです。めっさ少ない、かつjQueryっぽく取ってきたレスポンスの解析ができます。
もともとcheerio単体でもかなり幸せなのですが、こちらは他の必要なモジュールを内包しているのでかなり短いコードでスクレイピングを実現出来ます。

ちなみに出力結果は以下の通り

$ node app.js
Node.js + Expressでロギングしてみる
jQueryだけでコンテンツを自動スクロール表示してみる
続・Titanium Mobileで個人アプリをリリースしてみた結果 + iOS7対応でやったこととか
OS X MavericksにアップデートしたらTitanium Studioが動かなくなって焦る
JavaScriptで配列をソートする
TypeScriptを試してみた 3
TypeScriptを試してみた 2
TypeScriptを試してみた 1
APエンジニアはコード書いてなんぼだと思う(ひどく個人的な意見です)
jQueryでプレースホルダーを実装してみる
jQueryの話 attrとpropの違い
enchant.jsをTitanium Mobileで動かしてみる その1
Titanium Mobileで個人アプリをリリースしてみた結果
web系エンジニア限定!『エンジニアのキャリアをハックする』勉強会 感想
プロトタイプベースのjavascript設計 (2)
プロトタイプベースのjavascript設計 (1)
1画面内でバージョンの異なるjQueryを共存させるには
このブログについて

おお、ちゃんとタイトル取れていますね。

詳しい使い方は作者さんのページを見て下さい。リクエストのパラメータなんかも指定出来たりします。

http://www.npmjs.org/package/cheerio-httpcli

ちなみに取得先のページでJavaScriptを使った描画なんかをしていた場合は、レスポンスに入ってこないので、ブラウザでは表示されているけどスクレイピングしたら取れていないという状態になりますので注意してください。

ではでは。