この記事では、
ruby, nokogiriを使ってgoogle検索結果をスクレイピングしてみます。
googleの検索結果を定期的にバッチ処理などでチェックしておけば、
WebサイトのSEO対策などにも使うことが出来ると思われます。

Nokogiri 鋸
 http://nokogiri.org/

nokogiriのインストール

まずはnokogiriのgemをインストールします。

$ gem install nokogiri
Fetching: nokogiri-1.5.5-x86-mingw32.gem (100%)
Successfully installed nokogiri-1.5.5-x86-mingw32
1 gem installed

HTMLをチェック

次に、
google検索結果ページのhtmlを読んでみると、
以下のような構造で検索結果が出力されていることがわかります。
ここでは、
以下の構造で「★」で記載している2箇所を、
スクレイピングで取得することにします。

HTMLの構造

div[id=search]
 + ol
  + li
   + h3
    + a[href=/url?q=(★ここにリンク先URL★)&….)]
     + (★ここにリンク文言★)
  + li
  + li

検索結果HTMLの抜粋

= 省略 =
<div id="search"><div id="ires"><ol>
<li class="g">
<h3 class="r"><a href="/url?q=http://www.ruby-lang.org/ja/&sa=U&ei=kPM2UJPlLcLrmAXN7YDoCg&ved=0CCAQFjAA&usg=AFQjCNFXb1hjAouHiLRBV0MvCHS7ghY01A">オブジェクト指向スクリプト言語 <b>Ruby</b></a></h3>
= 省略 =

スクレイピング処理のコーディング

HTMLの構造を理解したところで、コーディングします。

nokogiriでは、
HTML構造のどの部分を読むかをCSSセレクタで指定します。
CSSセレクタについては、以下などを参考にして下さい。

セレクタ - CSS2リファレンス
 http://hp.vector.co.jp/authors/VA022006/css/selector.html

以下のコードでは、HTML構造の
「←★」で示す部分をCSSセレクタで指定しています

div[id=search]
 + ol
  + li ←★外側のループ
   + h3
    + a[href=/url?q=(リンク先URL)&….)] ←★内側のループ
     + (リンク文言)

get_gresult.rb:

#!/usr/bin/ruby
# -*- encoding: utf-8 -*-
require "rubygems"
require "nokogiri"
require "open-uri"
require "cgi"

keyword = "ruby"
escaped_keyword = CGI.escape(keyword)

# 検索結果を開く
doc = Nokogiri.HTML(open("http://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&q=#{escaped_keyword}"))

# liタグ以下を繰り返す
doc.search("div#search ol li").each_with_index do |li, idx|
href = ""
html = ""
link = ""

# aタグの中身を解析
li.search("h3 a").each do |alink|
href = alink.attribute("href")
URI.parse(href).query.split(/&/).each do |str|
strs = str.split(/=/)
link = strs[1] if strs[0] == "q"
end
html = alink.inner_html
end

# Webサイト以外(ニュースなど)はスキップ
next if "#{href}" !~ /^\/url/

# 結果表示
puts "idx: #{idx+1}"
puts "domain: #{link.split("/")[2]}"
puts "link: #{link}"
puts "html: #{html}"
puts ""

end

これを実行すると、次のような結果が得られます。

$ ruby get_gresult.rb
idx: 1
domain: www.ruby-lang.org
link: http://www.ruby-lang.org/ja/
html: オブジェクト指向スクリプト言語 <b>Ruby</b>

idx: 2
domain: ja.wikipedia.org
link: http://ja.wikipedia.org/wiki/Ruby
html: <b>Ruby</b> - メインページ - Wikipedia

idx: 3
domain: www.rubylife.jp
link: http://www.rubylife.jp/ini/
html: <b>Ruby</b>入門

== 省略 ==

このように、
HTMLの構造理解して、CSSセレクタで取得したい部分を指定して値を取得。
という流れで、いろいろなページのスクレイピングが可能になります。