いまさら聞けない? 初心者向けPlagger設定覚え書き その1

Plaggerをいじってみて、とても便利でなにより楽しくてしょうがない。まだ「それPla」ってほどなんでもできるわけじゃないけど、RSSを配信してないサイトから欲しい情報を取り出すことはできるようになった。意外と初心者向けの手引き的なものが見つからなかったので、初心者向けにメモしておきます。まだ簡単なことしかわからないし、間違ったことも書いてあるかも知れないのでいろいろ試してみながら確認してください。


まずはFilter::EntryFullText(みんなEFTって呼んでるみたい)について。

企業ニュースサイト(新聞社とか)のトップページにあるような自分のサイト内へのリンクのあるHTMLをフィードと変換するときに使うFilter。下のはYOMIURI ONLINEの科学のトップページから科学ニュースを取り出すためのyaml Wikipedia)。

author: Toshi
custom_feed_handle: http://www\.yomiuri\.co\.jp/science/
custom_feed_follow_link: /science/news
handle: http://www\.yomiuri\.co\.jp/science/news/
extract: <!--// headline_start //-->(.*?)<!--// article_end //-->
extract_capture: body

このファイルは assets/Plugin/Filter-EntryFullText/ ディレクトリ(Windowsならフォルダ)に適当な名前で保存します。するとconfig.yaml(後述)からFilter::EntryFullTextモジュールが呼び出されて、Plaggerに読み込まれてフィルタとして働きます。書いてあることは簡単で

custom_feed_handle
後で説明するconfigファイルに指定したソースとなるURL(もしくはFeed)にマッチするとこのファイルがフィルタとして読み込まれる。この例だと読売の科学ページだけが適用される。正規表現可能。
custom_feed_follow_link
読み込まれたサイトの中でDocumentRootからみたときにここにかかれたパスを持つものだけがエントリとして抽出される。この例だとhttp://www.yomiuri.co.jp/science/news/xxxというリンクだけが取り出される。正規表現を使ってhttp://www.yomiuri.co.jp/science/.*?/news/xxxとすればscienceとnewsの間になんか入るようなURLを指定することができる。
handle
このあとのextractの対象になるページのURLを指定。基本的にはcustom_feed_follow_linkが指定してるURLをhttpからすべて書いておけば問題ないと思う。
extract
これが肝。handleで指定したページからここで指定された領域にあるテキスト、カッコで括られた部分を抽出する。ここではニュース自体が欲しいので見出しと本文を抜き出すようにしている。この辺はソースを見て適当に。この例では単純なので使っていないけど正規表現を使うことで柔軟に対応できる。
extract_capture
extractで取り出したテキストを結果としてどの部分に使うか指定する。この例ではすべてをbodyにしているが見出しを1つめのカッコ、本文を2つめのカッコで括って抽出して、title body と指定すれば見出しをtitle、本文をbodyにすることができる。


呼び出す側のconfig.yamlはこんなかんじ。

global:
  assets_path: /PATH/Plagger/assets
  timezone: Asia/Tokyo
  log:
    level: debug

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www.yomiuri.co.jp/science/

  - module: Filter::Rule
    rule:
      module: Deduped

  - module: Filter::EntryFullText
    config:
      store_html_on_failure: 1

  - module: Widget::HatenaBookmark
  - module: Filter::HatenaBookmarkUsersCount
  - module: Widget::HatenaBookmarkUsersCount

  - module: Filter::BreakEntriesToFeeds

  - module: Publish::Gmail
    config:
      mailto:   xxx@gmail.com
      mailfrom: xxx+plagger@gmail.com

指定していることは、1)どこのページを読みに行くのか(Subscription::Config)、読み込んだ後どんな処理をするのか(Filter::Rule 〜 Filter::BreakEntriesToFeeds)、それをどうやって出力するのか(Publish::Gmail)ということだけ。抽出の仕方はFilterのyamlで設定しているのでここでは何も書かなくて良いです。ごちゃごちゃといじる設定はこんな感じ。

module: Subscription::Config
ここで読みに行くファイルを指定する。ここのURLとEFT用のyamlにあるCustom_feed_handleがマッチするとマッチしたyamlがフィルタとして呼び出される。
module: Deduped
重複したURLがあったときに重複をなくす。
store_html_on_failure: 1
1を指定することで、Filterのyamlで書いたextractの正規表現にマッチするものがなかったときにhandleで指定したページ全体を持ってくるように指定。(デフォルトは0)
module: Widget::HatenaBookmark
はてなブックマークに追加するリンクを出力に追加する。
module: Filter::HatenaBookmarkUsersCount
はてなブックマークに何人のユーザが登録しているかを表示するようにする。(Widget::HatenaBookmarkUsersCountと一緒に使うらしい)
module: Filter::BreakEntriesToFeeds
1つのエントリ(extractで抜き出したもの)ごとに1つのフィードやメールにする。

基本的にはこれでほとんどの企業サイトからフィードを抽出できるんじゃないかな?

でもこれでは個人ニュースサイトのようにサイトの外にリンクを張っているサイトからリンク先のサイトを抽出してくることはできない。それにはFilter::EntryFullTextではなくてCustomFeed::Configを使う必要がある。CustomFeed::Configの使い方に関してはまた明日。


【追記】

はてブコメントでtsupoさんにアドバイスを頂きました。作成したEFTyamlの保存場所、config.yamlによって指定されたURLとマッチすることによって呼び出されること、module: Subscription::Configによって読み込むファイルを指定することを追加しました。tsupoさんありがとうございました。


いまPla シリーズ 目次はこちらから

新聞社とかから抽出するためのEFT

朝日新聞 科学ニュース

author: Toshi
custom_feed_handle: http://www\.asahi\.com/science/
custom_feed_follow_link: /science/news
handle: http://www\.asahi\.com/science/news/
extract: <!-- Start of Headline -->(.*?)<!-- End of Kiji -->
extract_capture: body

2つのhandleを少しいじれば他のジャンルのニュースにも対応できると思う。


毎日-MSN 科学ニュース

author: Toshi
custom_feed_handle: http://www\.mainichi-msn\.co\.jp/science/
custom_feed_follow_link: /science/.*?/news
handle: http://www\.mainichi-msn\.co\.jp/science/news/
extract: <!-- || todays_topics ||-->(.*?)<!-- || /todays_topics ||-->
extract_capture: body


日経bp (IT、環境、企業・経営、製造のみ)

author: Toshi
custom_feed_handle: http://www\.nikkeibp\.co\.jp/
custom_feed_follow_link: /news/(?:it|eco|life|biz|manu)[0-9]
handle: http://www\.nikkeibp\.co\.jp/news/(?:it|eco|life|biz|manu)
extract: <!--begin: title and date -->(.*?)<!-- end: article -->
extract_capture: body

これも正規表現をいじったら対応するものを変えられます。