読者です 読者をやめる 読者になる 読者になる

(O+P)ut

習うより慣れろ、Practice makes perfect。この言葉をモットーに、Slerで働く若手インフラエンジニアが、学んだ知識を【 (O+P)ut = OutPut 】していく場です。

【Linux】wgetで桂離宮の参観可能日を取得する

f:id:mtiit:20170213141405j:plain
この写真は、約1年前に桂離宮で私が撮ったものです。

日本には、桂離宮修学院離宮の二つの現存する離宮があります。*1
これらの参観は無料ですが、事前に予約を行うのが一般的です。詳しくは宮内庁のHP参照。
予約はWebからもでき、例えば桂離宮について見てみますと以下のようにWebで空き人数付参観可能日が確認できます。
f:id:mtiit:20170213142210p:plain
これらの情報を、Webサーバーからファイルをダウンロードするためのコマンドwgetを用いて取得してみたいと思います。

2017年2月現在、上のページのurlは

"https://sankan.kunaicho.go.jp/register/frame/4201?ym=[西暦4桁][月二桁]"

という命名規則となっています。

標準出力に出すためのオプション -O - を使いまして来月(201703)でwgetをしますと以下のようにエラーとなります。※環境によっては証明書の発行者が不明というエラーが先に出る場合があるかとは思いますが。*2

wget -O - https://sankan.kunaicho.go.jp/register/frame/4201?ym=201703<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is

The requested URL was rejected に関してですが、調べてみますと
"ユーザエージェントWgetを排除している可能性がある"
ということが分かりました。宮内庁のHPに関しては、他のページも同じエラーが起きました。悪戯対策なんですかね?
オプション -U "" を用いて明示的にユーザエージェントを空欄に変更してみると、

wget -O - -U "" https://sankan.kunaicho.go.jp/register/frame/4201?ym=201703<html>
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <META http-equiv="Content-Style-Type" content="text/css">
...以下略

といった形で正規のhtmlを取得できました。

あとは、
日付情報↓

<TD width="20" align="center"><B>01</B></td>

参観可能人数情報↓

<img src="/images/false.gif">10:00(0人)

といったような構造になっておりましたので、以下のワンライナーで結果を取り出してみました。
読み方は、3月1日の15:30から2人空いている、といった感じです。

$ wget -O - -U "" https://sankan.kunaicho.go.jp/register/frame/4201?ym=201703 2>/dev/null | grep -B 10 '[1-9]人' | grep -e '[1-9]人' -e '<B>[0-9][0-9]</B>' | awk 'BEGIN{FS="[><]"}{print $5}'01
15:30(2)
02
10:00(1)
15:30(2)
03
09:00(4)
13:30(1)

ワンライナーに関して簡単に説明します。
大部分は 0人 ですので 0人以外のところを grep -B 10 '[1-9]人' で拾います。-Bオプションをつけることで、一致した行から前10行を同時に表示し、日付情報を拾い出しています。htmlを見ますと、日付~参加可能人数が10行毎に繰り返していたので今回はこのようにしています。そして、改めて日付と参加可能人数の情報をgrepで拾い出し、awkで欲しい箇所を抽出しています。今回は、< または > で区切るとどちらも5列目でしたので上のようにしました。

ちなみに、5月だと1日も空いてませんでした。。。
京都に立ち寄る予定がある方は、ぜひ事前に調べてみてください。

*1:修学院離宮にも行きました。どちらもぜひ一度は行ってみる価値ありです!

*2:接続先が信用できる場合では --no-check-certificate を追記ですれば簡易的に対応可能です。