いまさら聞けない? 初心者向け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: [email protected] mailfrom: [email protected]
指定していることは、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さんにアドバイスを頂きました。作成したEFT用yamlの保存場所、config.yamlによって指定されたURLとマッチすることによって呼び出されること、module: Subscription::Configによって読み込むファイルを指定することを追加しました。tsupoさんありがとうございました。
新聞社とかから抽出するための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
これも正規表現をいじったら対応するものを変えられます。