Yahoo Blog APIを利用してみる
久しぶりにYahoo devのサイトを見てみたところYahoo Blog APIなるものが2010/3/4に追加されてたので、なんとなくRuby用クラスを作ってみました。
ただ、ブログ情報検索なのだから日付指定フィールドは欲しいところですね。。日付指定項目ってのがありますが、これは最近1週間のBlog情報とかだから個人的にはそんなに必要でなかったり。
下記はてきとーに作ったソースだったり
# -*- coding: utf-8 -*- require 'open-uri' require 'cgi' require 'rexml/document' # Yahoo Blog API用のクラス class Yahoo_blog_search YAHOO_BLOG_SEARCH_URL = "http://search.yahooapis.jp/BlogSearchService/V1/blogSearch" APPID = "取得したAPPID" def initialize(query = "", results = 50, start = 1 , type = "all") @yahoo_api_query = "" @query = query @results = results @type = type @start = start @total_results_num = "" @raw_search_results_data = "" @rexml_search_results_data = "" @search_results_data = [] @search_all_results_data = [] end ################# クエリの作成 + 実行 ############################## def build_query @yahoo_api_query = "#{YAHOO_BLOG_SEARCH_URL}?appid=#{APPID}&query=#{CGI.escape(@query)}&results=#{@results}&start=#{@start}&type=#{@type}" end def execute_query @raw_search_results_data = open(@yahoo_api_query) {|f| f.read } @rexml_search_results_data = REXML::Document.new @raw_search_results_data end ################# 取得したデータから特定の情報を取得する関数群 ######## def get_total_results_available @total_results_num = @rexml_search_results_data.elements["/ResultSet"].attributes["totalResultsAvailable"] end def get_total_results_returned @rexml_search_results_data.elements["/ResultSet"].attributes["totalResultsReturned"] end def get_first_result_position @rexml_search_results_data.elements["/ResultSet"].attributes["firstResultPosition"] end def get_processing_data @search_results_data.clear resultset = @rexml_search_results_data.elements["/ResultSet"] resultset.elements.each("Result") do |i| tmp_result = {} tmp_result["Id"] = i.elements["Id"].text tmp_result["RssUrl"] = i.elements["RssUrl"].text tmp_result["Title"] = i.elements["Title"].text tmp_result["Description"] = i.elements["Description"].text tmp_result["Url"] = i.elements["Url"].text tmp_result["Creator"] = i.elements["Creator"].text tmp_result["mobileLink"] = i.elements["mobileLink"].text tmp_result["SiteTitle"] = i.elements["Site/Title"].text tmp_result["SiteUrl"] = i.elements["Site/Url"].text tmp_result["DateTime"] = i.elements["DateTime"].text @search_results_data << tmp_result end end ################ 指定したクエリに関するブログ情報をすべて取得する ################## def get_all_processing_data @search_all_results_data.clear @results = 50 @start = 1 build_query execute_query end_block = get_total_results_available.to_i / @results (0..end_block).each do |i| @start = 50 * i + 1 build_query execute_query get_processing_data #puts @search_results_data @search_all_results_data.concat @search_results_data end @search_all_results end # APIの実行結果に関する変数 attr_reader :total_results_num, :search_results_data, :search_all_results_data # クエリの設定に関する変数 attr_accessor :query, :results, :type, :start end if __FILE__ == $0 yobj = Yahoo_blog_search.new("それはそれはそれは", 15, 3) yobj.build_query yobj.execute_query puts "検索結果数 " << yobj.get_total_results_available puts "取得したデータの数 " << yobj.get_total_results_returned puts "取得したデータの初めのインデックス " << yobj.get_first_result_position yobj.get_processing_data # 特定クエリに関するブログ情報を全て取得する yobj.get_all_processing_data puts "取得したブログ数 " << yobj.search_all_results_data.size.to_s yobj.search_all_results_data.each do |i| puts "タイトル " << i["Title"] end end
実行結果は以下のような感じです
検索結果数 84 取得したデータの数 15 取得したデータの初めのインデックス 3 取得したブログ数 84 タイトル 6月11日(金)のつぶやき
とりあえずgistに貼っつけますた。
rexml使ってるので多少遅いかと