Ruby Nokogiri Anemoneを使ってスクレイピングに挑戦してみる その1

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

はじめに

Rubyでスクレイピングする方法について考えてみたいと思います。
調べてみたところ、「Nokogiri」と「Anemone」を使用すれば、比較的簡単にスクレイピングが実現できそうだということがわかりました。
さっそく試してみたいと思います。(正確にいえば、クローラーといったほうが良いかもしれません)

NokogiriとAnemoneをインストール

まずデータをスクレイピングするには、対象となるWEBページを巡回して、コンテンツ(HTMLファイル等)を取得しなければなりません。
(ちなみに解析するページ数が少なく、URLもわかっている場合は巡回せずに直接ページを解析するほうが簡単です)

そして、取得したページを解析して、必要とするデータを取得します。
データを解析するには下記の2つの方法があります。

  1. 正規表現によってパターンマッチングさせる
  2. 構文解析ツール(パーサー)を利用する

今回スクレイピングに利用する「Nokogiri」は解析を「Anemone」は巡回を担当します。
では、NokogiriとAnemoneをインストールしてみましょう。

bundleを利用する場合はGemfileに

と記載して、下記コマンドでインストールします。

まずは簡単なプログラムから

いきなり作り出してしまうと、エラーが出た時になかなか原因が特定できなくなってしまうので(私自身、エラーの原因が特定できずに苦しみました)、簡単なところから作り出したいと思います。
とりあえず最初は特定のサイトのタイトルを表示するプログラムから作ってみましょう。
手始めに私のブログのタイトルを取得してみましょう。

少し解説

自分の知識整理のために少し解説なんかしてみます。

まず、スクレイピングをするためには、解析対象のページを取得しなければなりません。

解析対象のページを取得するためには、サイトを自動で巡回して対象ページを取得するプログラムを作成する必要があります。
ただ、自分でサイトを巡回させるプログラムを作成するのは、ちょっと大変です。
そこで、Anemoneの出番です。Anemoneを利用すれば数行のコードでクローラーを作成できます。

上記のプログラムでは、まずスクレイピングする対象のページをAnemoneを使って取得しています。

はじめに、crawlメソッドにURLとして、「http://www.no-title.com/」を渡し、そこを起点として、サイトを巡回するようになっています。
とはいえ、今回は単純にブログのタイトルだけを表示させるプログラムなので、サイトを巡回させる必要はありません。
そこでオプションのdepth_limitを0にすることで巡回させないようにしています。
(ちなみにdepth_limitは巡回する階層の深さを示しています)

なので、今回の場合はAnemoneを使う必要性はありません。Anemoneを使わなくても、直接ページを取得したほうがラクだからです。
ただ、今回は説明のためにあえて巡回させる必要もないのにAnemoneを使用したということです。

話を戻します。上記のプログラムでは、Anemoneを使って、解析対象のページを取得することができたので、
次は取得したページを解析してブログのタイトルを取得する必要があります。

ページを取得する方法は、上記でも少し説明しましたが、正規表現によってパターンマッチングさせる方法と構文解析ツール(パーサー)を利用する方法があります。
どちらも一長一短ありますが、今回は、構文解析ツール(パーサー)を利用する方法を採用します。

構文解析ツールとして、今回はgemのnokogiriを利用します。NokogiriはRubyでは、もはやデファクトスタンダートといっても良い、非常に有名なスクレイピングライブラリです。

HTMLやXMLの構造を解析して、特定の要素を指定しやすい形に加工できる
XpathやCSSセレクタを使った要素の抽出を行うことができる
[引用:http://Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル]]

全体の流れを整理すると、Anemoneを利用して対象のサイトを巡回(クロール)して、解析対象のページを取得し、nokogiriで取得したい要素を特定するというイメージです。

続きはまた後日記載します。

記載しました。

参考書籍

参考サイト

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*

CAPTCHA