現在地

無理矢理RSS化pipes入門

作成者:mattz 作成日:2009/09/17(木) 00:33

問題はRSS吐いてないサイトであるとのコメントをいただいたので、その辺触れてみたい。正直先程と同様の精細度では書けないので(後半明らかに手抜きになったように)ポイントだけ。

なお、RSS吐いてないサイトをpipesでどうにかするためには、正規表現に関する知識が不可欠かと思われます。まったく分からんという方はどっかで勉強してきてください。

まず、RSSを出力していない以上、最初のFetch Feedモジュールは使えませんので、Fetch Pageモジュールからスタートすることになります。実はYQLなんていうモジュールもあって、なかなか複雑なこともできたりするんですが、SQLやらXPathなんていう知識まで必要になってきちゃうので、ここでは扱いません。その辺知ってるって人は勝手に研究してください。

今回は一から説明するのではなく、既にある、RSSをでっち上げるpipeをサンプルにします。今回はスクリーンショットを載せたりしませんので、Pipesの実際のソースや、サイトのソースをご自分で見ながら読んでください。またそういう前提で書きます。

PipesでRSSをでっち上げているサイトは僕が作った中にもいくつかあるんですが、とりあえず僕の好きな女優さんの一人であるいとうあいこさんが地図のマップルのサイトでやっている、いとうあいこのふんわり京都のRSS化について説明します。

本題とは外れますが、このサイト、なんでRSS配信しないんでしょうかね。まぁいいですけど。

このpipeのURLは http://pipes.yahoo.com/pipes/pipe.info?_id=yAn1bUFo3hGeMQoB3cXxwQ
pipeのソースを確認するにはCloneしてEdit Sourceすればいいです。

もともとRSSを出力していないサイトをRSS化するのにまず必要なのが、最近の更新一覧的なリストです。これがないサイトに関しては、pipeでどうにかするのは正直言って厳しい。Numeriとかは一度挑戦してあきらめました。ふんわり旅行記の場合は、旅行記一覧というページがあるので、そこをベースにします。

まずは、旅行記一覧のページのURLを、Fetch Pageモジュールに渡します。んで、ページを見て、ページのソースを見てというのを繰り返すと、どうやら、<dl class="TravelDiary">というあたりを使うのがよさそうだねってのが分かりますので、Fetch PageモジュールのCut content fromに<dl class="TravelDiary">を設定します。で、toの方なんですが、</dl>としてしまうと、最初の1個しか取れなくなってしまうので、このリストの次の要素の始まりである、<div class="kensu10HyoujiBtm">にします。これで、旅行記の一覧部分が切り出せましたので、あとはこれを個々のエントリに分けてあげる必要があります。どうするかというと、分割するために目印となる文字列を探します。前回のエントリでは、これについての説明は面倒なので省略しましたか、それがdelimiterです。この例では</dl>なんかが十分その役目を果たしてくれそうなので、それを設定します。という説明だけでは分からないでしょうけど、頑張って元のHTMLのソースを見てなんとか納得してください。

これで、とりあえず一つ一つの旅行記がいくつかのitemに分割されたわけですが、このままではとてもRSSリーダが読める状態ではないので、それをどうにかしてあげます。

RSSだと言い張るためには各itemにtitle要素、link要素が最低限必要で、pubDateなんかはあった方がいいし、どうせだからこいつもdescriptionに本文突っ込んでしまえばRSSリーダで全部読めて幸せなので、そこを着地点に設定します。まぁ全文取得に関しては一応前回説明したので今回は説明する気はないですけど。

で、話を戻して、</dl>で分割してあげたRSSのなりそこないの各itemは、content要素だけを持っている状態です。なんとなく結構頑張って我慢して読んでいた人でもこの辺で読むのやめたんじゃなかろうか思うんですが続けます。Pipes' EditorのDebbuger領域で確認してもらうと、このcontent要素の中身には、title、link、pubDateの各要素に相当する情報が入っていますので、ここからtitle、link、pubDateとしてちゃんと使える形として取り出す作業をこれから行います。

当然このままではどうにもなりませんので、このcontent要素を先ほども使ったRenameモジュールを使って、title、link、pubDateの各要素としてCopy As(実際には最後の1個はRenameですが)します。で、コピーした各要素について、日付やタイトルやURLとして使える形になるようにRegexモジュールで形を整えていきます。実際の設定はソースを確認して欲しいのですが、

<dl class="TravelDiary">
<dt><a rel="nofollow" target="_blank" href="http://www.mapple.net/travels/itoaiko/19350.htm">
2009年9月16日の旅行記</a><div class="Traveldate">旅行日:<span class="date">
<span class="datetext">
2009.09.16</span></span></div></dt><dd><div class="linkage">“京都の生き物たち”</div><p></p></dd></dl>

こんな感じだったcontent要素をCopy As or Rename後、Regexで色々やることによって、

item
  link:http://www.mapple.net/travels/itoaiko/19350.htm
  title:2009年9月16日の旅行記 “京都の生き物たち”
  pubDate:2009-09-16

こんなものにすることができます。

すでにこの状態でもRSSとしてはぎりぎり成立してますから、名前をつけて保存すればRSSリーダで購読することが可能です。

この後は、入用であれば前のエントリの要領で全文化するとかすればいいだけです。サンプルはそのようになっていますので、興味があればご覧ください。

例によって最後は手抜きになりましたが、以上で「無理矢理RSS化pipes入門」を終わります。

ツッコミ・質問は歓迎です。遠慮なくどうぞ。

タグ: