JR西日本の遅延っぷりはナイスだ。JR東日本もナイスだ。両者は良い勝負。正直いってJR西の方がひどい。西は、JR東日本に比べるとシンプル路線。相互乗り入れもない。神戸〜京都でもシンプル。奈良なんてシンプルすぎるくらいだ。なのに遅れ続ける。もはや企業文化に原因があるのだろう。
遅延情報ページもCacheヘッダを送ってくるが、 if-modified-since を送付しても無視っぽい。いつも200okしか帰ってこない。そういう企業文化なんだろう。
というわけでJRを監視。
JR西の運行情報ページに30秒に一度アクセスして、前回と内容が変わっていればメールを送ることにした。
#!/usr/bin/env ruby $KCODE='u' def check_jr_kinki require 'rubygems' require 'mechanize' m = Mechanize.new m.get 'http://trafficinfo.westjr.co.jp/kinki.html' p = m.page title1 = p.search('div#contents_title').text.gsub(/\d+/,"") #=> "17:40 現在 近畿エリアの運行情報です。" title2 = p.search('div.time').text #=> "17:35更新" title3 = p.search('div.unkou').text #=> "【JR神戸線】 人身事故 振替輸送開始" body = p.search('div.eikyou_block').text return [title1,title2,title3,body] end def send_notify(title,body) require 'rubygems' require 'net/smtp' require 'base64' require 'tmail' mail = TMail::Mail.new mail.to = "takuya@localhost" mail.from = "takuya@localhost" mail.subject = title mail.date = Time.now mail.mime_version = "1.0" mail.body = body mail.set_content_type "text", "plain", {"charset" => "iso-2202-jp"} Net::SMTP.start("localhost","25","local",nil,nil,"plain") do |smtp| smtp.sendmail( mail.encoded, mail.from, mail.to) end end require 'rubygems' require 'daemons' Daemons.run_proc('jr_west_checker') do ret2 = [nil,nil,nil,nil] ret = check_jr_kinki loop do send_notify( ret[0..2].join('ー'), ret[3] ) if ( ret.zip(ret2).map{|i,j| i==j }.reject{|i| i==true}.size > 0 ) ret2 = ret if ( ret.zip(ret2).map{|i,j| i==j }.reject{|i| i==true}.size > 0 ) sleep 30 ret = check_jr_kinki end end
しかもDaemonsでサービス常駐させてやった。もう何も怖くない。
mechanize 本当に便利ですね。
2012-02-02追記
ブクマコメントを頂いたので返信。
id:CIA1942
「もはや企業文化に原因が」福知山線の事故がなければもう少し状況は違ってると思いますよ?/それよりも「30秒に1回運行情報にアクセス」とか病的に近い頻度だと思うのだけど。
そう?キャッシュヘッダだけ見に行っても、毎回 200 OKが返ってくるので、どうしようもないんだけど。一分に一回でもいいんだけど、電車が15−20秒単位で運行されてることを考えると、「電車まだ来ないかーっ」ってストレスから見ればたいしたことないとも思う。
何秒にするかは、相手の更新頻度と間隔を考えて見極めたらいいのであって、WEBページのScrapeのWait時間に正解はないかと思うし、病的と言われるとちょっと。。。。
特に、今日(2012-02-02)のような大雪の日、また台風の日は、JR運行情報は毎分更新がありえます。大量更新がある事故が、いつ起きるわからないので、アクセスしすぎとも言えないんじゃないかと思います。
むしろ、画像やCSSを読み込まないので、ブラウザよりは通信量もコネクションも少ない。ですし
(最後のこれ↑は、言い訳がましいですけど)