Yahoo! Pipes の Page Fetch モジュールでスクレイピングし放題
このブログでも何度か Yahoo! Pipes の話題は取り上げてきましたが、先日実装された「Page Fetch」モジュールは素敵すぎます。ほんとに。
今まで、Yahoo! Pipes といえば、XML・CSV か Yahoo が提供してるサービスのデータを加工することしかできませんでした。それが、「Page Fetch」モジュールの登場により、任意の Web ページを加工できるようになったのです。
Yahoo! Pipes の使い道といえば、次の2つだと思います。
- 1. RSSリーダーで読むための XML 作り
- 複数の RSS を結合したり、見た目を整えたりして、自分専用の RSS を作る。
(例)サイトの最新被ブックマークを livedoor Reader で読むための Pipes - 2. Web サービスとの連携
- JSONP に対応してるので、JavaScript と組み合わせてサーバーレスに色々できる。crossdomain.xml に対応しているので、ActionScript と組み合わせてサーバーレスに色々できる。
(例)丸ビルRSSリーダー
このいずれに関しても、「Page Fetch」モジュールで可能性が広がってきます。
1. RSSリーダーで読むための XML 作り
任意のページの HTML を取ってこれるようになったおかげで
- RSS 配信していないページの RSS を作れます。
- 全文配信していないページの RSS の全文配信版を作れます。
ためしに、作ったのがこれ。Shinya talk という藤原新也さんのブログの RSS を作成してみました。
ソースはこんな感じ。
- Fetch Page でページを取得して、「<a id="」で分割(配列ができる)
- Rename を使って title, description, link に移動(配列を RSS 形式に変換)
- Regex を使って不要な部分を取り除いて、URL や本文を抽出
RSS は http://pipes.yahoo.com/nitoyon/shinya_talk_rss?_render=rss から取得できます。レッツ購読。
2. Web サービスとの連携
こっちは例を見てもらうほうが早いかな。はてブ ブックマーク件数一括取得API というのを作ってみました。
はてなブックマークのブックマーク件数を一括で取得するための Pipe です。Web サービスから使うイメージを醸し出すために API と名づけてます。
はてなが用意する ブックマーク件数取得 API は XML-RPC なので JS や AS からは扱いづらいし、RSS にもブックマーク数が入っていません。はてなアイデア - HTML→RSS で情報が落ちすぎ。ブックマーク数、できればタグとカテゴリもつけてほしい という要望が放置されているところを見ると、今後も RSS にブックマーク件数が追加される予定はなさそうです。
ってことで、「Page Fetch」モジュールを使って、ページ内のブックマーク一覧をスクレイピングしてます。JS や AS からこの API を使うこともできますし、サーバー側の Perl や PHP から XML をパースして利用も OK。
Yahoo! Pipes 側にキャッシュが効いてるので、はてなのサーバーに負荷をかけすぎる心配もありません。
応用例
この Pipe を活用して、複数ドメインの人気エントリランキング というのを作ってみました。雰囲気を知るには サンプルデータつき のものを見たほうがイメージが沸きやすいかもしれません。
通常、URL 別でしか人気エントリを見れないのですが、複数のURLで集計できます。
複数の場所でサイトを運営してる人は、自分が運営してるサイトを入れてみるとちょっと楽しいと思います。ブログの端っこに貼り付けてもいいかもしれませんね。
注意点
ちょっとはまったところ。
- 正規表現が必要
- 正規表現が分からないと自作するのはきつい。HTML はたいてい複数行なので s オプションをつけるのを忘れずに。
- なぜかパースできない HTML がある
- ヘルプには「robots.txt を設置していたり、meta タグで noindex しているサイトはパースできない」とあるが、それ以外のページでも失敗することがある。どうせ正規表現でパースするんだから好きにさせてほしい。
- 最後に正規化される
- a タグに rel="nofolow" が追加されたり、相対リンクが消えたり、HTML 的に変なところを正規化する。途中のモジュールをプレビューしたときも HTML が正規化されているが、正規化は一番最後に走るので混乱しないよう。スクレイピングするサイトのソースを見ながら作業したほうがよさそう。
- かなり面倒
- Yahoo! Pipes の応答速度が結構遅くて、1箇所変更しては2~3秒待っては確認を繰り返す必要あり。根気が必要。
地味に少しずつ機能追加されていってる Yahoo! Pipes ですが、まだまだできることは限られています。やりたいことを実現するには頭をひねらないといけません。けれども、そういうところも含めて論理パズルのようで楽しかったりもします。