(O+P)ut

(O+P)ut

(O+P)ut = Out + Put >> OutPut

【Linux】ユーザエージェント引数を用いてwgetを使用する

本記事について

wget -O - を実施した際に、
The requested URL was rejected. Please consult with your administrator.というエラーがでましたが、
wget -O - -U ""とするとエラーが解消した話です。


詳細

発生した事象

桂離宮という京都有数の観光地の参観予約情報を取得すべく、宮内庁のHPについてwgetを行いました。

例えば、後ろの数字を年月の6桁の数字にすればhtmlが取得できるはずが、

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...

エラーとなりました。

-O - 」はコマンドの結果を標準出力に出すためのオプション です。

ちなみにブラウザで見るとこんな感じで見れます。
f:id:mtiit:20170213142210p:plain

memo

環境によっては証明書の発行者が不明というエラーが先に出る場合があるかとは思いますが、接続先が信用できる場合では 「--no-check-certificate」 を追記ですればアドホックに対応可能です。


解決策

で、結論から言えばブラウザ等でhtmlを取得する際はブラウザ名がユーザエージェントというところに記載されているのですがここを変更すれば解決しました。
Bot対策でCUIでのwgetを排除しているのでしょうか。


実際に、オプション 「-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)

ワンライナーに関する説明は備考欄に。興味がある方のみご覧ください。*1

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

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

以上です。

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