« 「Nutch」ですいすい情報収集 (クローリング機能を試す) | メイン | Windows再インストール時の強い味方 「DriverMax」 »

「ECS」+「Timeline」で発売日リストをつくってみました

  はてなブックマークに追加 このエントリを livedoor クリップへ追加

Amazonの「ECS」から商品リストを取得して、商品を発売日順に「Timeline」で表示してみました。


作業内容は、以下のとおりです。

(A)「ECS」から商品リストを取得する
(B)「ECS」から取得した商品リストのXMLフォーマットを「Timeline」で利用するXMLフォーマットに変換する
(C)「Timeline」で商品リストを表示する


今回の作業(A)(C)についての詳しい説明は、次の記事を参照してください。
Amazon E-Commerce Service(ECS) Ruby編
「Timeline」 - スケジュール管理、年表作成だっておてのもの

(B)についても、コードを見ていただくのが早いと思いますので、以下にコードを示します。


(A)「ECS」から商品リストを取得する

(ファイル名: ecs.rb)

require 'net/http'
require 'cgi'
require 'rexml/document'

class ECS

  AWS_BASE_URL = "http://webservices.amazon.co.jp/onca/xml?"
  AWS_ACCESS_KEY_ID = "[アクセスキーを指定する]"
  SERVICE_NAME = "AWSECommerceService"
  SERVICE_VERSION = "2006-11-14"
  ASSOCIATE_TAG = "[アソシエイトキーを指定する(省略可)]"


  @@operation = "ItemSearch"
  @@responseGroup = "ItemAttributes,Images"

  @keywords
  @searchIndex
  @parameters

  def searchBooks keywords
    @keywords = keywords
    @searchIndex ="Books"
    setParameters
    url = createURL
    xml = requestToECS url

    return xml
  end

  private

  def setParameters
    @parameters = {
      :Service => SERVICE_NAME,
      :Version => SERVICE_VERSION,
      :AWSAccessKeyId => AWS_ACCESS_KEY_ID,
      :AssociateTag => ASSOCIATE_TAG,
      :Operation => @@operation,
      :ResponseGroup => @@responseGroup,
      :Keywords => @keywords,
      :SearchIndex => @searchIndex
    }
  end

  def createURL
    paramString = (
      @parameters.collect { |key,value| "#{key}=#{CGI::escape(value)}" }
      ).join('&')

      url = URI.parse( AWS_BASE_URL + paramString )

      return url
  end

  def requestToECS url
    xml = REXML::Document.new( Net::HTTP.get( url ) )
    return xml
  end

end


(B)「ECS」から取得した商品リストのXMLフォーマットを「Timeline」で利用するXMLフォーマットに変換する

(ファイル名: ecsXML.rb)

require 'rexml/document'

class ECS_XML

  @@xpath = "ItemSearchResponse/Items/Item"
  @@xpathURL = "DetailPageURL/text()"
  @@xpathImage = "SmallImage/URL/text()"
  @@xpathTitle = "ItemAttributes/Title/text()"
  @@xpathDate = "ItemAttributes/PublicationDate/text()"


  def initialize xml
    @ecsXML = xml
  end

  def toEventXML

    eventXML = ""

    eventXML << "\n"
    eventXML << ""

    @ecsXML.elements.each( @@xpath ) { |element|
      url = REXML::XPath.match(element, @@xpathURL)
      image = REXML::XPath.match(element, @@xpathImage)
      title = REXML::XPath.match(element, @@xpathTitle)
      date = (REXML::XPath.match(element, @@xpathDate))[0].to_s.split("-")
      date = (Time.gm *date).strftime("%b %d %Y") + " 00:00:00 GMT+9:00"

      eventXML << "
                   end=\"#{date}\"
          isDuration=\"false\"
          title=\"#{title}\"
          image=\"#{image}\"
          link=\"#{url}\"
        >
        
\n"
      }

      eventXML << ""

      return eventXML

    end

end


(ファイル名: ecsToEvent.rb)

require 'ecs.rb'
require 'ecsXml.rb'

ecs = ECS.new

# "Java"というキーワードで商品検索を行う
xml = ecs.searchBooks "Java"

# XMLフォーマットを変換する
ecsXML = ECS_XML.new xml
event = ecsXML.toEventXML

puts event


コマンドラインから次のコマンドを実行します。

  ruby ecsToEvent.rb > ecs.xml


(C)「Timeline」で商品リストを表示する

(B)でつくった、「ecs.xml」というXMLファイルを「Timeline」に読み込ませると、年表上に商品リストが表示されます。


こちらの例のように表示されると思います。

タイトルが日本語なので、年表上に表示される文字の区切りがおかしくなっています。
なんとか、修正できないかと検討中です。




Ads BOARD








最近のエントリーとその関連エントリー

トラックバック

このエントリーのトラックバックURL:
http://kazuhiro.ty.land.to/blog/mt-tb.cgi/124

  Map