Yahoo! Pipesの話

今さらながらpipesがマイブームなのでメモしておく。

そもそも何で今さら?という話ですが、"乃木坂 RSS"で検索すると出てくる胡散臭いサイトがあって、一体どういうものが出てくるのだ?と興味本位で登録してみたらpipesかよ!ということがありまして。

で、改めて調べてみると、XPathが使えてscraperチックなことができそう、ということが分かって、ちょっといじってみるかーとなったわけです。

例題

とりあえずサンプルとして、WUGのニュースからRSSを作成してみることにしましょう。

Wake Up, Girls! 1期シリーズ公式サイト

1. Xpathでタイトルとリンクを取得

Extract using XPath: に "//div[@id='contents']/table/tr" を指定。"id('contents')" という形式は使えないっぽい。

この時点でデバッガウインドウを見てみると、こんな感じに。

"Emit items as string" をチェックしないとDOMツリーが出てくる。チェックするとHTMLテキストが出てくる。

ここではDOMを使いたいのでチェックしない。

2. title と link にマッピング

このページのパクリ。簡単。

Tumblr


3. 各記事の本文を取得

まあ無くてもいいんだけど、ニュースの本文がdescriptionに出てきたほうが見やすいので。さきほどマッピングしたitem.linkの各URLから本文のテキストをXPath "//div[@id='contents']" で取ってくる。

Loopモジュールと組み合わせるのがコツといえばコツかな?たいしたコツではない。

あとでいじるのでDOMではなくHTMLテキストとして出力させる。

4. 微調整

ニュース本文から余分なヘッダーやらフッターやらを除く。この辺泥臭いので、もう少しDOMを柔軟にいじるモジュールがあってもいいかなあ。あるのかも知れんが。

デバッガーでソースが見られるので、適宜整形。

<div id="contents">
      <h2>2/27(木)bayfm78:K・WEST ENTAME GENERATION、出演決定!</h2>
      <div>
        <p>2014/02/24</p>
      </div>
      <br/>
      <div>
        <strong>bayfm78:K・WEST ENTAME GENERATIONへのゲスト出演が決定!</strong>
      </div>
      <div>
        <p> </p>
      </div>
      <div>
        <p>【日時】2月27日(木)19時〜</p>
      </div>
      <div>
        <p>【番組名】
        <strong>
          <a rel="nofollow" target="_blank" href="http://homepage2.nifty.com/marua-S/kashifm.htm">bayfm78:K・WEST ENTAME GENERATION</a>
        </strong></p>
      </div>
      <div>
        <p>【出演者】田中美海、高木美佑
        <br/>
        <br/>
         お楽しみに!</p>
      </div>
      <br/>
      <br/> 
      <div class="back">
        <a rel="nofollow" target="_blank" href="http://wakeupgirls.jp/news.php">< 戻る</a>
      </div></div>

これが

<div id="contents"><br/>
      <div>
        <strong>bayfm78:K・WEST ENTAME GENERATIONへのゲスト出演が決定!</strong>
      </div>
      <div>
        <p> </p>
      </div>
      <div>
        <p>【日時】2月27日(木)19時〜</p>
      </div>
      <div>
        <p>【番組名】
        <strong>
          <a rel="nofollow" target="_blank" href="http://homepage2.nifty.com/marua-S/kashifm.htm">bayfm78:K・WEST ENTAME GENERATION</a>
        </strong></p>
      </div>
      <div>
        <p>【出演者】田中美海、高木美佑
        <br/>
        <br/>
         お楽しみに!</p>
      </div>
      <br/>
      <br/> 
      </div>

こんな感じ。Regexのオプションは説明が無いのでよく分からんけど、多分sがsingle line(<div>.+</div>とかで改行を含む文字列にマッチする)で、mがmultiple lines(^とか$が各行にマッチするようになる)という感じなのかな。mはPerlと同じ感覚でよいが、sはこういう解釈でいいいのだろうか。sとmを同時に指定したらどうなるんだろう・・・?

あと、内部のXML Parserを通しているせいか、"emit items as string"をチェックしても元データのHTMLとは違うものが出てくるので注意が必要。

まあ、とりあえず動けばよいか。

5. 完成

大体のサイトはXPathで抜き出し→マッピング→整形 の流れでRSS化できそう。IFTTTとかのRSSと連動するWebサービスと組み合わせれば、もっと色々なことができるんじゃないかと思う。

http://pipes.yahoo.com/pipes/pipe.info?_id=508c47e7c3fa362fc6687b251b71a8f0

追記

動くは動くんだけど、遅すぎてRSSリーダーによってはタイムアウトすることがあるっぽい。loop + fetch page系は注意せねば。