Gemに渡す町コードを一括保存するバッチを作成した
先日、以下の記事で紹介した、ごみ収集曜日を取得する処理をGemへ渡すためのコードを取得するバッチを作成しました。
なぜ作成したか。
先日書いた記事でも紹介しましたが、このGemでごみ収集曜日を取得するためには以下のパラメータとして以下のコードを渡す必要があります。
- 区コード
- 頭文字コード
- 町名コード
しかし、上記コードを見つけるためには、実際に横浜市のHPにアクセスし、URLを確認してパラメータを設定しなければなりません。 それだと、そもそも横浜市のHPにアクセスしているので「普通にで確認すれば良いじゃん」になるので、一括で上記コードを取得し、DBに保存するバッチを作成しました。
ページの構造
ごみ収集曜日のページ(横浜市資源循環局)は以下のような階層構造になっています。
収集曜日ページのトップです。区を選択することができます。 区の名前をクリックすると、その区の町名の頭文字を選択する画面に遷移します。
- 頭文字の選択ページ
例:港北区(区コード:16) http://cgi.city.yokohama.jp/shigen/kaishu/mobile/16
町(収集場所)の頭文字を選択する画面です。以下のような構成で各行ごとにリンクが貼られています。
[1] あ~お [2] か~こ [3] さ~そ [4] た~と [5] な~の [6] は~ほ [7] ま~も [8] やゆよ [9] ら~ろ、わ
- 町名の選択ページ
例:港北区(区コード:16) さ行(頭文字コード:3) http://cgi.city.yokohama.jp/shigen/kaishu/mobile/16/3
選択した区の選択した行(あかさたな)に該当する町名一覧が表示されます。
港北区のさ行では、以下の一覧が表示されます。
町名にリンクが貼られており、クリックすると、該当の町の収集曜日が表示されます。
篠原北1丁目 篠原北2丁目 篠原台町 篠原町 篠原西町 篠原東町1丁目 篠原東町2・3丁目 下田町1・2・3丁目 下田町4・5・6丁目 新横浜1・2・3丁目 新吉田町 新吉田東1~6丁目 新吉田東7・8丁目
- ごみ・資源物の収集日ページ
ここで、ごみ・資源物の収集日を確認することができます。
例:港北区(区コード:16) さ行(頭文字コード:3) 町コード 1073 http://cgi.city.yokohama.jp/shigen/kaishu/mobile/16/3/1073
Gemは、このURLを見てページからごみ収集曜日を取得します。
バッチの取得対象
先述した通り、
- 区コード
- 頭文字コード
- 町名コード
がわかれば、ごみ収集曜日を取得することができるので、 区から町名を選択する画面まで、リンクに含まれる各コードと名称を取得しながら再帰的にデータを取得していきます。
収集場所までバッチで持ってくれば良いのでは?とお思いの方もいらっしゃると思うのですが、 すべてのページのデータを持ってくるためには、 18区×あかたたな(9行)×町名分必要であり、横浜市のサーバへかなりのリクエストが発生してしまうため含めておりません。
あとは、もうGemつくちゃったしな・・・と、なんかすいません。といった感じです。
また、負荷については怒られないように、配慮していてバッチ内では5秒一回しかリクエストを飛ばさないようにしています。
作ってみた所感
今回は、基本となる機能は雑に一気に仕上げ、それから例外処理の追加やリファクタリングをしていくという流れで実装していきました。 ほぼ勢いで実装しましたが、丁寧に積み上げていく方式よりも自分の感覚的に合っているなと感じました。
というのは、処理を書く上で色々考えなければならないことがシンプルになるということ * Rubyっぽく書くには * クラスをどう分ける? * わかりやすい変数名は?
と、普段は実装する上で同時に考えることが多いので、まず一気に仕上げてから細かい部分を調整していくやり方にしてみて、こっちの方が性にあっているのでは?という気持ちになっていますす。(精神的にも疲れにくく、集中して取り組めたのではないかと感じました。)
すべてのケースには当てはまらないと思いますが、実装の仕方はこれからも試行錯誤しながらやっていきたいと思います。