hakeの日記

Windows環境でプログラミングの勉強をしています。

ブックオフ

発売から時間の経った本の購入にはブックオフを良く利用させてもらっています。ただ残念なことに地元には小型と中型の店舗しかないので、例えばシリーズもので途中が抜けていたりすることもしばしば。こんど東京に行った時にあちらのお店でも見て回ろうかと思っていたらこちらの日記を発見。
町田のお店が大きいというのはあちこちで聞いて知っていましたが他にも大きな店がたくさんあるんですねー、原宿が一番行き易いかな。あと自由が丘の店にも行ってみたいっす。

リスト取得

てなわけでブックオフのサイトの店舗情報をちまちまと見ていたのですが一覧が欲しくなったので取得するスクリプトを作成。それにしても店舗数が1000以上もあるんですねースゴいなあ。


スクリプトsjisで保存、同じディレクトリにbookoff.logを作成。エラー処理を行っていないので途中で停止した場合には、ID_STARTを書き換えて実行すれば追加作成される。

#!/usr/bin/env ruby
$KCODE = 's'
require "open-uri"

ID_START = 1
ID_END   = 1060
LOG = 'bookoff.log'
URL = 'http://www2.info-mapping.com/bookoff/kensaku/map.asp?ID='

page = nil
(ID_START .. ID_END).each do |id|
	p id

	url = ''
	url = URL + id.to_s
	open( url ) do |f|         # ページ取得
		page = f.read
	end

	if page == ""
		puts "no data"
	else
		name = ""		# 店舗名
		time = ""		# 営業時間
		addr = ""		# 所在地
		scale = ""		# 店舗規模
		accs = Array.new # アクセス案内

		status = 0
		page.each do |line|
			line.chomp!
			case status
			when 0  # 店舗名
				status = 1 if /店舗名/ =~ line
			when 1
				if /\<div.*\>(.*)<\/div>/ =~ line
					name = $1
					status = 2
				end
			when 2  # 営業時間
				status = 3 if /営業時間/ =~ line
			when 3
				if /\<div.*\>(.*)<\/div>/ =~ line
					time = $1
					status = 4
				end
			when 4  # 所在地
				status = 5 if /所在地/ =~ line
			when 5
				if /\<div.*\>(.*)<\/div>/ =~ line
					addr = $1
					status = 6
				end
			when 6  # 店舗規模
				status = 7 if /店舗規模/ =~ line
			when 7
				if /\<div.*\>(.*)<\/div>/ =~ line
					scale = $1
					status = 8
				end
			when 8  # アクセス案内
				status = 9 if /アクセス案内/ =~ line
			when 9
				if /\<td class.*\>(.*)<\/td>/ =~ line
					accs.push($1)
				elsif /^\s*\<\/table\>$/ =~ line
					status = 10
				end
			else 
				break
			end
		end

		File.open(LOG, "a") do |f|
			f.puts id.to_s
			f.puts "店舗名   = " + name
			f.puts "URL      = " + url
			f.puts "営業時間 = " + time
			f.puts "所在地   = " + addr
			f.puts "店舗規模 = " + scale
			if accs.size > 0
				f.puts "アクセス案内"
				accs.each{|i| f.puts i}
			end
			f.puts "----------"
		end
	end
end