Plagger導入

スクレイピングをやっていきたいと思ったので、「Plagger」を使ってみることにしました。
色々なところで言われている通り、ドキュメントが少ないです。
分かりやすい解説もあるのですが、その通りにやっても正常に動かなかったりしました。
ってことなので、ここに書くことも「自分がうまくいったケース」に過ぎないと思います。

Plaggerインストール

流れとしては、


cpanコマンドでPlaggerのインストールを試みる

依存モジュールがなかったり入らなかったりして失敗する

cpanコマンドで依存モジュールをインストール、テストで入らなかったらforce install
それかCpanサイトに行ってDLしてコンパイルしてインストールする


という感じでやっていきます。

無事にインストールできたら「plagger -v」でバージョンチェックできると思います。


参考にさせていただいたサイトはこちらです。

Plaggerの使い方

Plaggerがどういうものかは、下記の記事を読んで掴みました。
一足早く「Plagger」の便利さを実感してみよう


最初の3ページでなんとなく概要が分かります。
後半の2ページで素直に実行できればいいのですが、そううまく行かない。


実際の使い方は、下記のページの「いまPla その1」を参考にして、動作確認を行ないました。
いまPla もくじ。


けど、やっぱり素直に上手くいかなかったです。ってことで、自分が辿った作業をメモしていきたいと思います。

Filter::EntryFullText(EFT)の設定ファイルを作成


Plaggerが取ってきたデータに対して行なうフィルタの設定ファイルを作成します。
下記の設定を「filter_yahoo.yaml」という名前で作成しました。

author: memememomo
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/」に置けばいいらしいのですが、どこかよくわかりませんでした。検索しても出てこないし・・・。


こちらの記事によると、Plaggerのソースからassetsディレクトリを持ってくると良い、といったことが書いてあったので、CPANサイトからソースをダウンロードして、その中にあるassetsディレクトリをそのまま「~/plagger」に移しました。


これで無事に「assets/plugin/Filter-EntryFullText/」に「filter_yahoo.yaml」を置くことができました。


次にPlaggerに読み込ませる設定ファイル「config.yaml」を作成しました。

global:
  assets_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


そして、Plaggerを実行します。
plagger -c config.yaml


正常に動作すると「Public::Gmail」部分で設定したメールアドレスにニュースが届くようになります。

エラーメモ


上記のようにできるまでに遭遇したエラーメモです。

Plagger [error] http://www.yomiuri.co.jp/science/ is not aggregated by any aggregator」エラーメッセージ


このようなエラーが出て、メールが送られない現象がありました。
これは、単純に「filter_yahoo.yaml」の置き場所と
「config.yaml」での「assets_path:」の指定の仕方が悪かったみたいです。
つまり、Filter::EntryFullTextが設定ファイルをうまく読み込めていなかった、ということです。
もし、「filter_yahoo.yaml」の「custom_feed_handle:」の値と、
「config.yaml」の「feed: -url:」の値が一致していなければ、
うまく読み込まれないので、同じエラーメッセージがでると思われます。

エラーは出なくなったけど、メールが届かない


データ取得がうまくいくと、データはキャッシュされるようになります。
キャッシュされる場所は「~/.plagger」です。
「config.yaml」の

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


という指定をしていると、新しく取ってきたデータとキャッシュデータを比べて、相互に違いがなければメールが送信されません。
うまく行っているけどメール送信がされない、と思ったら、この指定を一回消してから実行するといいかもしれません。
普段は、同じ内容のメールが届かないように、指定をしてある状態にしておいた方がいいでしょう。

Plaggerの勉強


ということで、ひとまず動作確認はできたので、参考文献を読みながら使い方を学びたいと思います。
ちょっとしたら、Plaggerのソースも読み進めていきたいと考えています。

参考予定の文献