前回のJSON編は面白かったかしら?簡単で楽しいわよね。
だけど読んでくれている子の中には「APIじゃなくて直接叩いてみたいんだ」ってシロウみたいな子もいるかもしれないわね。じゃあ、そっちをやってみましょうか。
でもひとつだけ忠告しておくわ。
GoogleがわざわざAPIを用意しているのは、そちらを使ってほしいからなの。つまり検索結果を直接読み取って欲しいとは思ってないはずなのよね。
それに、明日にも使えなくなるかもしれない方法だから、実用になるともいえないし。
とどめに、検索結果と関係ない広告なんかも含まれる事があるから、その意味でもおすすめできないの。
だから、あくまで「こんなこともできるんだ」というテキスト的なものだと思ってね。
検索結果自体の取得方法は任せるわ。手はいくらでもあるもの。 ちなみに、わたしが試したパターンはこうね。
require 'nokogiri' require 'open-uri' : keyword = "衛宮士郎" e_keyword = URI.escape(keyword) e_btn = URI.escape("検索") doc = nil begin url = "http://www.google.co.jp/search?q=#{e_keyword}" x = "" open(url).each{|d| x += d.clone } doc = Nokogiri.HTML(x)
ans = [] # li(検索結果要素)により繰り返す。 doc.search("div#search ol li").each_with_index do |li, idx| href = "" html = "" link = "" # aタグの中身を解析する。 li.search("h3 a").each do |a| href = a.attribute("href") # リンク先がWebサイトでない(URLを含まない)場合はスキップ next if href.value !~ /^\/url/ URI.escape(href.value).split(/=/).each{|b| if b =~ /^(http|https):\/\// p b link = b.split(/&/)[0].unescape_Slash break end } html = NKF.nkf("-w",a.inner_html) end # 結果 if link != nil && link != "" && html != nil && html != "" ans[ans.length] = GoogleLink.new(link,html) else p link,html end end ans.each{|d| print <<EOM #{d.domain} #{d.link} #{d.html} EOM }
うん、こんなところかしら?
コードは、特に nokogiri関係の情報サイトを漁りまくって探したものだけど、何とか動いたみたいでホッとしたわ。
さて。