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
[ツッコミを入れる]