読者です 読者をやめる 読者になる 読者になる

Anemone&Nokogiriでクローラ作成してスクレイピング

エンジニアインターン浦川です。8ヶ月が過ぎましたが、初めて書きます。

院試明けのタスクとしてスクレイピングを割り当てられ、先程実装終了したので、

スクレイピングについて書こうと思います。

とりあえずgemをインストール。

# Gemfile
gem 'anemone'
gem 'nokogiri'

Anemone
クローリング(サイトの巡回)が簡単に出来てしまう素晴らしいgem

Nokogiri
ノコギリのようにスクレイピング(HTMLを解析しデータ抽出)してくれるこちらも素晴らしいgem

次に文字コードUTF-8に変換してくれるライブラリkconvをロードする。

# crawler.rb
require 'kconv'

これで準備は整いました。
実際のコードを書くと長くなってしまうので、一般的な使い方を掲載します。

# crawler.rb
require 'kconv'

url = "http://example.com/"
Anemone.crawl(url) do |anemone|
  anemone.on_every_page do |page|
    doc = Nokogiri::HTML.parse(page.body.toutf8)
    items = doc.xpath("//div[class='item-list']/ul/li")
    items.each do |item|
      title = item.xpath("div[class='item-title']").text
    end
  end
end

ここでやっているのは、

1. 指定したURLのサイトをAnemoneオブジェクト(*)にする

url = "http://example.com/"
Anemone.crawl(url) do |anemone|
end

2. そのサイトからリンクで辿れる全てのページをAnemoneオブジェクト(*)にする

anemone.on_every_page do |page|
end

3. それをtoutf8でUTF-8に変換したものをNokogiriオブジェクトにする

doc = Nokogiri::HTML.parse(page.body.toutf8)

4. xpathを用いて欲しい要素を取得する

items = doc.xpath("//div[class='item-list']/ul/li")
items.each do |item|
  title = item.xpath("div[class='item-title']").text
end

です。

crawlの引数にはurlの配列やオプションも渡せます。
オプションの例としてdepth_limitがあり、これを0にすると(2.)においてリンクで辿れるページは無視します。

これでスクレイピング完了です。簡単ですね!!

(*)実際にはAnemone::Core, Anemone::Pageとなります。
詳しくはこちらを参照してください。
http://www.rubydoc.info/github/chriskite/anemone/Anemone