スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ソフトバンクの携帯情報配布CSVのフォーマットが変わった

毎日定時にここからソフトバンクの携帯情報をCSVで取得して、携帯DBを更新しているのですが、突然エラーのメール届きました。
ワークテーブルに取り込む時にエラーになっているようです。
それで、色々調べてみるとCSVのフォーマットが変更され「x-jphone-sound」が無くなっていました。
金曜日の定時までエラーがでなかったので、それ以降変更されたものと思います。
しかし、ニュースとか新着とか更新情報には、どこにも書いてないんですよ。
以前もいきなり、携帯からアクセスするIPアドレスを追加したこともあり、こういういきなりの変更は困りますね。
スポンサーサイト

DoCoMoの機種名とユーザエージェントを取得する

昨日と同じノリで、DoCoMoのユーザエージェントのページからシリーズ名、機種名、ユーザエージェントを取得してCSVで出力します。
rubyとnokogiriを使っています。
DoCoMoのこのページでは、テーブル構造が複雑なのでxpathでtdを根こそぎ持ってきた後、ロジックでゴリゴリ組んでいます。「DoCoMo」という文字列が来たらユーザエージェントと決めうちしたり、tdのclassでシリーズ名を決めうちしたりなど、やってます。
# -*- coding: utf-8 -*-
require 'nokogiri'
require 'open-uri'
require 'kconv'

# テキストノードのみ回収する
def getValue(td)
result = ""
xpath = %{.//span}
spanList = td.xpath(xpath)
if nil == spanList || 0 == spanList.size
return ""
end
spanList.each(){|span|
children = span.children
children.each(){|node|
if "text" == node.name
result = result + node.text()
end
}
}
return result.gsub("\n", "")
end

url = "http://www.nttdocomo.co.jp/service/imode/make/content/spec/useragent/"
xpath = %{//td}
nokogiri = Nokogiri::HTML.parse(open(url).read.toutf8, nil, 'UTF-8')
tdlist = nokogiri.xpath(xpath)
serias = ""
kisyu = ""
xpath = %{.//span}
tdlist.each(){|td|
# ヘッダーは処理しない
if "brownLight acenter middle" == td["class"]
next
end

# シリーズ取得
if "acenter middle" == td["class"]
serias = td.text()
next
end

# 機種名またはユーザエージェント取得
val = getValue(td)
index = val.index("mova")
if val.start_with?("DoCoMo") || val == "" || nil != index
#N2701対応
if nil != val.index("mova")
#「・FOMAモード」と「・movaモード」を取り除く
val = val.toutf8
val.sub!("・FOMAモード", "")
val.sub!("・movaモード", "")
end
# ユーザエージェントのあるもののみ出力
if val != ""
# 複数ユーザエージェントがある場合は別々に出力
ary = val.split("DoCoMo")
ary.each(){|v|
if v != ""
puts "#{serias},#{kisyu},DoCoMo#{v}"
end
}
end
else
# 機種名の取得
kisyu = val
end
}

Tag : ruby

auの機種名称とデバイスIDを取得する

auのユーザーエージェントのページに、機種名称とデバイスIDの一覧が載っています。
ページを解析して、「機種名称,デバイスID」の組のCSVを出力したいと思います。
スクリプトはrubyで、HTMLのパースはnokogiriを使用します。
肝は最初のxpathの所にありまして、ここで必要なtrタグを根こそぎ集めています。
後はtdの中身を機種名称、デバイスIDの順に交互に出力するだけです。
ただしデバイスIDの一部に同じ機種名に対して複数持つものがあるので、そこだけ注意が必要です。
後、当然ですがKDDIがこのサイトの構成を少しでも変えるとこのスクリプトは動かなくなるので使用する場合はその点を気をつけてください。
# -*- coding: utf-8 -*-
require 'nokogiri'
require 'open-uri'
require 'kconv'

url = "http://www.au.kddi.com/ezfactory/tec/spec/4_4.html"
xpath = %{//table[@border='0'][@cellspacing='1'][@cellpadding='0'][@summary='']//tr}
nokogiri = Nokogiri::HTML.parse(open(url).read.toutf8, nil, 'UTF-8')
trlist = nokogiri.xpath(xpath)
trlist.each(){|tr|
tdlist = tr.xpath(%{./td})
if "機種名称" == tdlist[0].text().toutf8
next;
end
flag = true
name = ""
tdlist.each(){|td|
if flag
name = td.text()
print "#{name},"
flag = false
else
value = td.text()
ary = value.split("/")
if ary.size > 1
puts "#{ary[0]}\n#{name},#{ary[1]}"
else
puts value
end
flag = true
end
}
}

Tag : ruby

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。