はじめに
こんにちは。GMOアドマーケティングのyoshishinです。
皆さんは普段、よく使うWEBサービスなどありますか?
自分は最近、予約システムをよく使うようになったのですが、毎回同じ操作をしており、効率的ではないと感じています。
多くの人が使いやすいように作られているとは思うのですが、人によって感じ方は様々で、手順が決まっているのであればいつもの設定をボタン一つでできたら便利ですし、中には自分専用の画面がほしかったりするかもしれません。
今回はこのような予約システムを使いやすくするためのハックを考えていきたいと思います。
目標
予約システムから必要な情報を取り出し、使いやすいJSON形式に整形して任意のレスポンスを返すことを目標とします。
JSON形式であれば、データを元に画面を作ったり、思い通りに操作することが容易となります。
開発環境
まずは開発環境を整えます。
今回メインで使うライブラリはnokogiriです。
HTMLという素材からノコギリで必要なものを切り出していくイメージですね。
Rubyが使える状態であれば、以下のコマンドでインストールできます。
gem install nokogiri
Railsを使う場合はこのgemが含まれているため、bundle installすることで追加されます。
公式サイト
http://www.nokogiri.org/
以下、公式サイトのサンプルです。
require 'nokogiri'
require 'open-uri'
# HTMLドキュメントを取得し、解析
doc = Nokogiri::HTML(open('https://nokogiri.org/tutorials/installing_nokogiri.html'))
puts "### Search for nodes by css"
doc.css('nav ul.menu li a', 'article h2').each do |link|
puts link.content
end
puts "### Search for nodes by xpath"
doc.xpath('//nav//ul//li/a', '//article//h2').each do |link|
puts link.content
end
puts "### Or mix and match."
doc.search('nav ul.menu li a', '//article//h2').each do |link|
puts link.content
end
xpass,cssを使い、レスポンスを確認しながら目的のデータを取得します
解析
次に解析です。
Chromeであれば、画面を右クリックして、検証を選択することで、HTML構造を確認できます。
HTMLの構造から特徴をまとめていきます。
普段使っているWEBサイトであれば、どういう構造で、どんなデータが欲しいのかはすぐに想像できると思いますし、何らかの不満を感じているのであれば、こうすれば使いやすくなるという改善案もあると思います。
対象システムでは日にちごとにいくつかの時間があり、時間毎に予約枠を持っているという特徴がありました。
設計
専用画面を作り、登録した設定情報を元に予約できるようになれば便利になると思うので、JSON形式のレスポンスを返し、そこから画面を表示できるようにしていきます。
解析時の特徴から、以下のようなJSON形式にすると使いやすそうなので、データを整形していきます。
[{"day"=>"12/23", "times"=>[
{"time"=>"12:00", "stock"=>0},
{"time"=>"12:15", "stock"=>0}, {"time"=>"12:30", "stock"=>0}, {"time"=>"12:45", "stock"=>0},...
]
データ取得
理想の形が定まっているのであれば、あとはnokogiriでひたすらデータを切り出し、設計したJSON形式にデータを格納していきます。
作ったデータを呼び出すメソッドを用意すればJSON API化は完了です。
対象サイトをスクレイピングして整形したJSONを返し、それをRailsの画面で表示してみました。
まとめ
以上の手順でJSON API化することができました。
ここまでできれば後は使いやすい画面を作るなり、設定に従った自動予約、チャットシステムとの連携など、思い通りに操作することができると思います。
予約システムだけでなく、他の仕組みにも応用できると思うので、毎日多くの時間を費やしているシステムがあれば、使いやすくハックすることも検討してみてはいかがでしょうか?
注意点として、実際に使うタイミングで自動予約するのであれば手動でアクセスするのと比べて負荷は変わりませんが、バッチを使った予約の空き枠通知など、定期的にアクセスする実装はサーバーの負荷になってしまうため、控えた方がよいと思います。
以上です。
明日は、M.Nさんによる「TAXELの回遊率を少しだけ最適化した話」です。
引き続き、GMOアドマーケティング Advent Calendar 2019 をお楽しみください!