Fastladder または Automatic Ruby + Fluentd を利用してフィードを購読する

[前回](http://qiita.com/ynakayama/items/f41977ce551405fcdad3)までフィードについて色々と書いてきましたが、今回はそのフィードを Fastladder および Automatic Ruby + Fluentd を利用して購読する方法を説明します。

## 主要新聞社のフィードを購読する

企業の情報をキュレーションするにあたり情報源を定めておく必要があります。まず誰でも思いつくのは、たとえば新聞やテレビの情報です。主要新聞社五社のニュースフィードは次の通りです。なお、残念ながら執筆時点で読売新聞はフィードの配信を終了しています。

産経新聞
(SankeiBiz)
http://www.sankeibiz.jp/rss/rss.htm

朝日新聞
http://www.asahi.com/information/service/rss.html

日経新聞 (非公式)
http://www.zou3.net/php/?page=rss&sub=nikkei
(日経 BP)
http://www.nikkeibp.co.jp/article/news/20081006/102677/?rt=nocnt

毎日新聞
http://mainichi.jp/rss/

読売新聞 (2014 年 3 月で RSS フィード配信終了)
http://www.yomiuri.co.jp/info/yol2014/

### フィードのインポート・エクスポート形式

[OPML](http://ja.wikipedia.org/wiki/Outline_Processor_Markup_Language) はよくフィードの情報をインポート・エクスポートするのに使われる XML の形式です。上記の主要新聞社の OPML フィードを [GitHub](https://github.com/ynakayama/sandbox/blob/master/ruby/feed/major_newspaper.opml) に用意しておきました。

### Fastladder へのインポート

Fastladder で OPML をインポートするにはアカウントの設定画面から以下のように Import を選択します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/aa29ce5f-690e-18d6-c1e9-ae2cafe0f63c.png)

さきほどの[リンク](https://github.com/ynakayama/sandbox/blob/master/ruby/feed/major_newspaper.opml)からダウンロードした OPML ファイルを Fastladder へアップロードします。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/38501/c21b3bae-4ece-efaa-ff49-d8690b1ed550.png)

すると次のように Fastladder での購読が可能になります。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/a4797cfd-7bf5-769a-743d-4cfbbc6927c6.png)

livedoor Reader や feedly など類似のサービスへのインポート方法については、各サイトの情報を参照してください。

## Automatic Ruby でのクローリング

[Automatic Ruby](https://github.com/automaticruby/automaticruby) は Ruby で書かれたフィードアグリゲーターです。これを利用して各新聞社の情報を収集し [Fluentd](http://www.fluentd.org/) 等に出力することができます。

このソフトウェアの動作は YAML という可読性の高い形式で書かれます。 Automatic Ruby ではこれをレシピと言います。

上記新聞社のフィードを購読し Fluentd に出力するレシピを同じく [GitHub](https://github.com/ynakayama/sandbox/blob/master/ruby/feed/major_newspaper.yml) に用意しました。

これを使えば Automatic Ruby でクローリングが可能になります。

### レシピの形式

このレシピの書き方は [Plagger](http://ja.wikipedia.org/wiki/Plagger) というソフトウェアにインスパイアされています。以下に例を挙げます。

```yaml
plugins:
  - module: SubscriptionFeed # フィードを購読するプラグインの名前
    config:
      feeds: # 購読するフィードの一覧
        - http://live.sankeibiz.jp/live/rss/schedules/latest/latestrss.xml
        - http://www.sankeibiz.jp/rss/news/points.xml
        - http://www.sankeibiz.jp/rss/news/flash.xml
        - http://www.sankeibiz.jp/rss/news/business.xml
        - http://www.sankeibiz.jp/rss/news/policy.xml
        - http://www.sankeibiz.jp/rss/news/compliance.xml

  - module: StoreFullText # 全文を DB に溜めるプラグインの名前 (重複も排除される)
    config:
      db: sankei.db # DB の名前

  - module: PublishFluentd # Fluentd に出力するプラグインの名前
    config:
      host: localhost
      port: 9999 # Fluentd の稼働するポート番号 (この例では 9999)
      tag:  news.sankei # Fluentd に渡す「タグ」の名前
```

このように利用するプラグインの名前を列挙すればフィードが順々に処理されていくというわけです。各プラグインの設定の書き方は[ドキュメントを参照](https://github.com/automaticruby/automaticruby/blob/master/doc/PLUGINS.ja)してください。

Subscription プラグインはフィードを生成する効果を持ち FilterClear プラグインを通すことでそれより上流のフィードは捨てられます。[レシピ](https://github.com/ynakayama/sandbox/blob/master/ruby/feed/major_newspaper.yml)を見ていただくと、四つの新聞社のフィードについて、フィードの購読→全文保存→ Fluentd へ出力、というサイクルを繰り返していることがおわかりかと思います。

なお全文保存する StoreFullText というプラグインは、すでに保存されているエントリについては後続へ渡さず、新規に保存されたエントリのみを後続へ渡す効果があります。これを利用して、新しく配信された記事のみを Fluentd に出力している、というわけです。

### Fluentd の設定

Fluentd のほうは待ち受けするポートをして常駐させておき、結果を任意の出力場所へと出力します。ためしにテキストファイルとデータベースにそれぞれ出力する例は次の通りです。

```xml
<source>
  type forward
  port 9999
</source>
<match news.*>
  type copy
  <store>
    type file
    path /home/xxx/.fluent/log/news.log
  </store>
  <store>
    type sqlite3
    path /home/xxx/.fluent/db/news.db
  </store>
</match>
```

以下は少々読みづらいですが Fluentd から JSON 形式のテキストとしてフィードを保存した例です。タブ区切りで、時刻印、タグ、記事の JSON データとなっています。 Automatic Ruby で指定した新聞社の名前がタグに入っています。

```json
2014-10-17T19:20:14+09:00       news.mainichi   {"title":"佐賀県副教育長が語る、1人1台PC導入の効果と課題","link":"http://www.nikkeibp.co.jp/article/news/20141017/420587/","description":" 「（1人1台パソコン導入の）成果は何か、とよく問われるが、成果はまだない。“成果”というには、もう少しきっちりした分析が必要だからだ。ただ、効果は確実に現れている」——。佐賀県教育委員会の福田孝義副教育長は2014年10月17日、2014… ","content":null,"created_at":"2014/10/17 19:20:14"}

2014-10-17T19:20:14+09:00       news.mainichi   {"title":"［ITpro EXPO 2014］「アーキテクチャーの理解が企業経営を左右する」、NTTデータの椎名常務が講演","link":"http://www.nikkeibp.co.jp/article/news/20141017/420591/","description":" 「ITが社会に浸透する中で、新たなアーキテクチャーを理解することが企業経営を左右する時代になっている」——。2014年10月15日から17日まで東京ビッグサイトで開催されている「ITpro EXPO 2014」で、特別講演に登壇したNTT… ","content":null,"created_at":"2014/10/17 19:20:14"}

2014-10-17T19:20:14+09:00       news.mainichi   {"title":"［ITpro EXPO 2014］IoTによるビジネス変革の秘訣は？先進3社が議論","link":"http://www.nikkeibp.co.jp/article/news/20141017/420590/","description":" 2014年10 月17日まで東京ビッグサイトで開催中の「ITpro EXPO 2014」では同日、「IoTはもうビジネスを変えている」と題したパネルディスカッションを開催した。キヤノン、凸版印刷、ソフトバンクグループのデータ分析専門会社Ag… ","content":null,"created_at":"2014/10/17 19:20:14"}
```

あとはこれを入力に各種プログラミング言語で自由自在に料理すれば良いわけです。

## まとめ

今回はフィードを購読する方法を Fastladder および Automatic Ruby + Fluentd の組み合わせで説明しました。