先日の kyoto.pm ハッカソンで、時代錯誤な feed 生成ツールを作りました。
なんでもRSSとか類似サービスいろいろあるとは思いつつ、scrapeするコード書くの好きだし、kindle本セールのフィードが欲しかったので作ってみました。完全自動でフィードつくるより、xpath(もしくはCSSセレクタ)で指定できる方が好みのフィードが作れそうというのが理由です!
使い方は簡単です。任意のURLを入力します。
すると、iframe内にコンテンツが表示されます。
こっから、フィードにしたいアイテムを選びます。Yahooの「主なサービス」のフィードを作ろうと思ったら、マウスカーソルをフォーカスすると…
iframe内右上に xpath がサジェストされます(cho45の jautopagerize のコードをパクりました)。これを参考に、リストアイテム用の xpath を指定すると…
...
kindle セール本フィード
というわけで、kindleセール本のフィードも作ってみた!
こんな設定で、こんなフィードができました。
テーブル内に、商品画像の行と、商品説明の行が別の tr であるので、tr[position() mod 3 = 2] みたいに特定の周期の tr だけを取得したり、こういった細かい指定も xpath ならではです。
技術的な説明
- HTML::TreeBuilder::XPath - add XPath support to HTML::TreeBuilder - metacpan.org
- HTML::Selector::XPath - CSS Selector to XPath compiler - metacpan.org
- HTML::ResolveLink - Resolve relative links in (X)HTML into absolute URI - metacpan.org
- iframe 用に、相対パスを全部書き換えます
あたりを使ってます。ありふれた感じですね!
ソースは https://github.com/onishi/xpathfeed にありますのでご笑覧ください。
外部HTMLの取得後、HTTP::Response をしばらくキャッシュする以外は動的にフィードを作成しているため、ストレージ不要なサービスになっています。自分用に自宅サーバなどで簡単に立ち上げられると思います。メインのクラス XPathFeed.pm はウェブアプリ以外にも使える感じにしており、
use XPathFeed; my $x = XPathFeed->new; # URL を指定 $x->url($url); # リスト構造のための xpath を指定 $x->xpath_list($xpath); # フィード作成 print $x->feed;
みたいに使えます。
ウェブアプリは Amon2::Lite で app.psgi だけに書いてあるので
plackup app.psgi
で簡単に起動できます。Amon2::Lite 初めて触ったけど便利ですね!