2009年 05月27日(Wed) [長年日記]
_ [TCG][ruby][プログラム]ブシロードTCGカードリストダウンローダー
ヴァイスシュヴァルツやChaosといったブシロードのTCGのカードデータを公式ページのカードリストから取得するスクリプト。
過去に作ったChaos用スクリプトの改良版といった位置付け。
とはいっても取得できるデータはテーブル内のHTMLなので実際に使う際には各々のTCGに合わせたパーサを書かないといけませんが。
require 'rubygems' require 'mechanize' require 'watir' require 'kconv' def getExpansionList(uri) agent = WWW::Mechanize.new page = agent.get uri (page/"div[@id='expansionList'] a").to_a.inject ([]){|array, link| array << link.inner_text } end def getCardList(uri, expansion) ie = Watir::IE.new ie.goto uri ie.link(:text, expansion.kconv(Kconv::SJIS, Kco nv::UTF8)).click str = '' array = [] n = 0 begin flag = false ie.document.Links.each{|i| if i.Href =~ /cardno/ array << i.Href end if i.InnerText == '≫' flag = true end } ie.link(:text, '≫').click if flag end while flag ie.close array end def getCard(uri) agent = WWW::Mechanize.new page = agent.get uri (page/'table.status td').to_a.inject([]){|array , e| array << e.inner_html} end
例えばChaosのカードをYAMLにしたい場合はこんな感じで。
require 'Ya2YAML' $KCODE = 'u' CHAOS_LIST_URI = 'http://chaos-tcg.com/jsp/cardli st' list = {} getExpansionList(CHAOS_LIST_URI).each{|expansion| list[expansion] = [] getCardList(CHAOS_LIST_URI, expansion).each{|ca rduri| array = getCard(carduri) sleep 1 card = {} name, kana = /(.+)<br><span class=\"kana\">(. +)<\/span>/.match(array[1]).to_a.values_at(1,2) card['カード名'] = name card['カナ'] = kana card['カードNo.'] = array[2] card['性別'] = array[3] card['レアリティ'] = array[4] card['種類'] = array[5] card['属性'] = array[6] card['攻撃力'] = array[7] card['耐久力'] = array[8] card['攻撃力(補正)'] = array[9] card['耐久力(補正)'] = array[10] card['テキスト'] = array[11] card['フレーバー'] = array[12] card['エクスパンション'] = array[13] card['参加作品'] = array[14] list[expansion] << card } } puts list.ya2yaml