Hatena::ブログ(Diary)

Master of None RSSフィード

ゲームを作ったり遊んだりする人のブログ
「閃光乱舞」
「白黒迷図」
「錯視迷図」
「桜乱忍者」

2008-03-05

muzieのRSS作成手順

| 10:48

結論

muzieの指定ページのRSSを吐くモジュールPipesで作成した。

おそらく他の人でもコピーすれば使えるはず。

ベース

Yahoo! Pipes の Page Fetch モジュールでスクレイピングし放題 - てっく煮ブログにて、「RSS配信してなくてもPipesRSSを作成できる」という話題、すなわち「それPipes」を見たので、「それならば、muzieもこれでチェックできるんじゃなかろうか(muzieRSSに対応してないっぽく、さらに"なんでもRSS"では更新しすぎる)」ということでやってみる。


手順

サンプルコード解析

さきほどのページでリンクされてたPipesのページに移行。

「View Source→Save a copy」で自分のところに持ってきたが、「Clone」で一発だったのかもしれない。まぁ、どうせコードを見るので気にしない。


で、先ほどのページの解説を読みながらコードを眺める。

RSSは基本的にただのXMLだったはずなので、その構造の解説を探したところRSSを配信しよう - phaのPHPとか自習室 - はてな自習室で紹介されていた。で、これらをもとに見ていくと、だいたい以下のような処理をしている模様。

  • FetchPage
    • URLで指定したページのソースを持ってくる
    • Cut 〜に対応する部分を切り出す
    • Split 〜の部分を一つのフィード(item)とみなして切り分ける
  • Rename
    • 切り分けたやつを、それぞれtitle、description、linkにコピーする(contentは不要なのでRenameで破棄?)
  • Regex
    • あとはソースコードの形式に応じて「title」「link」「description」を適切な形に変換

muzieHTML解析

今回はno titleをサンプルとして解析する。他のmuzieのページも同じ構造のはず。

「右クリック→ページのソースを表示」と実際のページを比べつつ、どれを「タイトル」「リンク」「要約」にするかを考える。上方にある「最新の楽曲」っぽいのでも良かったが、ひとまず下のほうにある「楽曲一覧」っぽいところをRSS化する。


「タイトル」についてはそのまま「TITLE:」のところで良いだろう。「要約」もその下にある文章で良い。だが「リンク」はどうすべきか。迷った挙句、「MP3ダウンロード」のリンクを選ぶことにした。(リンク先はあとで修正されました)


コンバート

さきほどクローンした部分を以下のように変更する。(<と>は実際には半角の方)


  • このPipeのタイトルと説明
    • 左上の名称と、右上のPropertiesの中身を変更する
  • Fetch Page
    • URLを今回のページにさしかえる
    • 「main02」の中が楽曲一覧のようなので、Cut 〜では「<div id="main02">」から終端までを選ぶ
    • 「"marr04 marl04"」が1楽曲のようなので、Split 〜では「<divclass="marr04 marl04">」とする
  • Rename
    • ここはサンプルコードと全く同じ
  • Regex
    • title
      • 場所
        • 「TITLE:」の先を指定すればよい
      • 基本的な考え方
        • 「〜」「TITLE:」「ここを採用」「〜」
      • HTMLでの対応
        • 「〜」「TITLE:</span>」「ここを採用」「</strong>〜」
      • 正規表現(実際には、変なものを捕まえないようにもう少し長い)
        • 「.*」「TITLE:</span>」「([^<]+)」「.*」
    • link
      • 場所
        • MP3と書いてるボタンのリンク先を指定する
      • 基本的な考え方
        • 「〜」「ボタンのリンク先を採用」「〜」
      • HTMLでの対応
        • 「〜」「<a href=/download/〜>と書いてあるところを採用」「〜」
      • 正規表現(変なのを捕まえないように長くしたいところ)
    • description
      • 場所
        • 共通表示の下にある文章
      • 基本的な考え方
        • 「〜」「あの文章を採用」「〜」
      • HTMLでの対応
        • 「〜」「<div class=listentxt>の中の最初の<p>の中を採用」「〜」
      • 正規表現
        • 「.*」「<div class=listentxt><p>と</p>の間」「.*」
        • サンプルと同じ感じで、「<div class=listentxt><p>以前を削除」「</p>以降を削除」として抽出
  • Filter
    • 必要ないかもしれないけど、一応サンプルコードのまま入れておくことにする

実行確認&修正

さっそく確認したところ、以下の問題を確認。


  • リンク先に飛べない
    • エラーページに飛ばされる
  • 他のidのページも確認したい場合に追加が面倒
    • 処理全体をまるまるコピーする必要がある

ということで、以下の変更を加える

  • リンク先をベースとなるページに変更
    • 曲一覧のところを指定しても良かったかも
  • 処理部分をモジュール化し、URLの指定だけ外部から受け取るようにした
    • User inputsのURL Inputを利用

で、できたのが以下。

使い方

自分で指定したページのRSS配信を行いたい場合、以下のようにして行います。

  • モジュールのコピー
    • no titleから、「Clone」でおそらくコピーできます。(ダメなら「View Source→Save a copy」で)
  • モジュールを呼んで、結果をUnionでつないで出力
    • 「Create a pipe」で新しくPipeを作成し、「My pipes」からさきほどのモジュールを選びます。
    • そこにRSSを配信させたいページのURLを入れ、「Pipe Output」につなぎます。
    • 複数のURLを入れる場合、それぞれにモジュールを作成して、Operatorsにある「Union」でまとめたあと「Pipe Output」につなぎます。
トラックバック - http://d.hatena.ne.jp/o_healer/20080305/1204681686