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