ScraperWiki を使って勝手 RSS フィードしてみた

なでしこジャパンやら政変やらで一喜一憂していた夏も終わりますね。という訳でこんにちは。今年の夏もバカンスともロマンスとも縁の無かった Mariyudu@セミの抜け殻状態、です。

さて先日、Web ページスクレイピング処理関連の作業をしていて、前に某ブログさんで知った ScraperWiki なるサービスを思い出し、道草というか、少し試してみることにしました。

ScraperWiki とは

ScraperWiki ってのは、文字通りスクレイピングプログラムを共有することで、Web 上にある有用なデータを皆で共有して幸せになろう、って主旨のサービスらしいです(About ページを参照のこと)。以下のような特徴があります。

  • Web ページ内のエディタ上でスクレイピング処理のプログラムを書いてトライ&エラーで実行きる。
  • プログラム言語は Python, Ruby, PHP から選べて、それぞれスクレイピングに必要なライブラリも用意されている。
  • スクレイピングして得られた結果は SQLite データベースに保存できる。
  • 保存したデータは SQL で自由に取り出して「ビュー」プログラムにより様々な形式で HTTP 出力することができる。
  • 書いたスクレイピングプログラムの実行をスケジューリングできる(最頻で1日1度)。

特にスクレイプ結果を DB に保存するあたりは、オブジェクトを丸ごと放り込むようなインターフェースの API が用意されていて、スキーマの構築も不要だわ複数レコードも一発格納だわ、恐るべきお手軽さです。

お題

さて、このサービスを試すにあたって課したお題は、私が以前から愛読させてもらっている「下町音楽夜話」という音楽エッセイ記事の RSS フィードです。このページ、古くからあるだけあって RSS フィードに未対応なのはもちろん(苦笑)、最新記事ページはフレームで個別の記事ページを埋め込んであるというように、記事の更新を検知しづらい構造になっています。これまでは、はてなアンテナで更新を知るようにしていたのですが、勝手に RSS フィードを作って愛用の Google Reader 上で他のサイトとまとめて購読できるようにしちゃえ、という目論見です。

実際にスクレイパーを作ってみる

じゃあ、サービスが英語表記のみということもあるので、RSS フィードに至るまでの手順を簡単に説明しましょうね。まずは、ScraperWiki のトップページ右上から [Log in] > [Create an account] と辿って(下図)、ユーザ登録します。

では、スクレイパー(ページをスクレイピングして結果を DB に保存する処理)を作成してみましょう。ダッシュボードページ右側の「New scraper」をクリック(下図マル1)すると、使用する言語を選択するポップアップが表示される(下図マル2)ので、好きな言語をクリックします。私は Ruby を選びました。

するとスクレイパーのエディタページに遷移します。ここでコードを書き(下図マル1)、「RUN」ボタンをクリックして実行することができます(下図マル2)。私が書いたスクリプトここから閲覧できるので、ご参考までに。

スクレイパーが書けたら保存しましょう。ダッシュボードページで DB に保存したデータをプレビューしたり(下図マル1)、実行スケジュールを設定したり(下図マル2)できます。

前述のようにスクレイパーは結果を DB に保存する役割のコードなので、これに HTTP 経由にて何らかの形式でアクセスできるようにするには「ビュー」というコードを対で書く必要があります。手順は、スクレイパーと同じようにダッシュボードページ右側の「New scraper / view」の「view」をクリックしてビューのエディターページに遷移します(下図)。ここで同様にコードをかいて、適宜実行という手順でビューを完成させます。私が書いたビューはここです。

ビューを完成させたら、ダッシュボードページ上部の「Click to open this view」をクリック(下図)することで公開用の出力が表示されます。上記で提示した私の書いたものの URL は、https://views.scraperwiki.com/run/shitamachi_ongaku_yawa_rss/ となっています。

以上です。スクレイピングの一連の作業が全てブラウザ上でできるので、とても使い勝手がいいですね。コードはそれぞれの言語やライブラリに属することがらなのでここでは特に触れませんが、唯一ハマった箇所として、ビューを XML 形式で出力する際にどうしても末尾に広告バナー(?)の div が付加されてしまう件がありました。これはサンプルコードにあるように

ScraperWiki.httpresponseheader( "Content-Type", "text/xml; charset=utf-8" )

と Content-Type を XML と明示してやる(デフォルトは HTML)ことで回避できます。ScraperWiki 謹製のライブラリについてはドキュメントページを参照して下さい。

オチ、というか後日談というか

さて、こうして「勝手 RSS フィード」はいちおう実現できたのですが、これを Google Reader に登録してみたところエラーになってしまいました。内容が悪いのかと、出力された RSS をダウンロードして自分のサーバに置き、それを登録してみたところ問題なかったので SSL でのフィードを Google Reader が扱うあたりに何か不具合があるのかもしれません。結果として当初のミッションは達成できなかったことになりましたが、ScraperWiki を試してみるという面では良い体験になりました。

尚、このサービスは Wiki と銘打っているように、公共性の高い情報に対してのスクレイピングを共有してこそ価値を発揮するサービスだと思っています。今回のチャレンジの目的は極私的なものでしたが、つぎは多方面に何らかの貢献ができるようなネタを考えてみたいと思います。