ruby, nokogiriを使ったgoogle検索結果のスクレイピング
この記事では、
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セレクタで取得したい部分を指定して値を取得。
という流れで、いろいろなページのスクレイピングが可能になります。