今回はブログの書き込みデータを取得する方法を見ていきます。
今回、ブログデータの中でも”書き込み日時”、”記事タイトル”、”記事内容”を特に見ていきますが、
ブログサービスによって、その他付随している”タグ”や”コメント数”などの情報も
以下の方法で同様に取得可能かと思います。

今回、ブログデータを取得するために、Rubyの”Anemone”パッケージを使用します。
「Amazonの購入履歴を取得する」で見たように、
Rubyのmechanize+nokogiriでもよいのですが、
Anemoneには再帰読み込みなど、クローリングに便利な機能がもともとついておりますので
コードがスッキリするかと思います。
※といっても、情報の抜き出しにはnokogiriを用います。

anemone自体のインストールは別の記述に譲りますが、下記で可能かと思います。
※事前に必要なパッケージなどはお使いの環境にあわせてください。
※”権限が無い”というエラーが出る場合は「sudo gem〜」で実行してください。



まずは必要なパッケージをロードします。





続いて、対象となるURLを設定し、
anemoneに再帰呼び出しさせます。



ちなみにループ対象となるページを絞りたい場合は
上記ループ中の中でさらに、正規表現で、特定の文字列を含むサブドメインなどを
指定するとよいかと思います。


あとは、ブログの抜き出したい箇所に応じて、
正規表現で抜き出すか、あるいはdiv中のものであればnokogiriに処理させるのも手かと思います。
以下は、日時やタイトルがdivできれいに囲まれていないときに、
特定の文字列で正規表現で抜き出す例です。



上記で一通りの処理となるのですが、いくつか細かい点について補足します。

(1) メタ文字のエスケープ
正規表現などで文字列を抜き出そうとした際に、メタ文字と呼ばれる特殊な記号が含まれている場合、
エスケープ処理をする必要があります。
メタ文字のエスケープについては下記、様々なサイトでまとめていただいておりますので、ご参照ください。
http://www.rubylife.jp/regexp/ini/index5.html
http://www.mk-mode.com/octopress/2013/02/13/regexp-html-tag/

(2) 文字のエンコード
続いて、文字の処理をしていると1度はつまづくのが、文字のエンコードとなります。
anemone、nokogiriなどで抜き出してきた文章について、何も考えずに処理すると、
対外、「Encoding::UndefinedConversionError」や「Encoding::InvalidByteSequenceError」に
出くわすことになります。
適宜、文字コードを指定する、前処理として未定義の文字を置き換える、必要があります。
文字コードについては下記詳しくまとめられております。
http://ref.xaio.jp/ruby/classes/string/encode



(1),(2)をふまえ、たとえばブログ本文が、特定のdivで抜き出せないとき、
さらに大きな固まりでdiv指定して取得し、エスケープ処理しながら邪魔な文字列(タグ含む)は削除していきつつ、
文字コードを正しく指定することで、必要なブログ本文を得ることができます。





以上で、適宜csvに書き出せば自動でブログの内容一覧を取得することが可能です。

得られたデータは、MeCabなどで、形態素解析や共起語分析などすると、
意外な発見があって面白いかと思います。
※たとえば、下記は友人のブログを自動で収集し、RMeCabで共起語分析した例となります。

rmecab


このままでは、細かいノイズが多くて、何がなんだかよくわかりませんね笑
共起語分析をRMeCabで処理する際に、きれいに表示するための方法については、
別記事で書いてみようと思います。

以上、今回はブログデータの取得でした。