はじめまして、Shintaroです。
Winautomationでプロセスを作成するのが好きなエンジニアです。
今回はWinautomationでYahoo!路線情報の乗換案内を利用した定期経路調査ロボット(プロセス)を作ったので、数回に分けてご紹介していきます。
Webサイトを利用したロボットを作りたいと思っている方々の参考になれば幸いです。
なお、Winautomationの基本操作を理解していることを前提として書いていきます。
どういったロボットか
Yahoo!路線情報の乗換案内はこれです。目的地付近の駅までの経路を調べたい時に使ったことがある人も多いと思います。定期券の金額も確認することができます。
今回はインプットとして出発駅、到着駅、定期代を入力させ、
乗換案内を利用して以下をチェックします。
・入力された定期代が正しいか
・入力された定期代と一致する経路が最短経路 or 最安経路か
チェックした結果をExcelファイルにまとめて出力します。
「各社員の定期経路の申請内容が正しいかチェックする」といった人事部などにありそうな業務を想定しました。
今回はインプットをダイアログボックスで作成しますが、実際の運用では申請フォームなどをインプット&トリガーにすれば大幅な業務改善が見込めると思います。
処理の流れ
全体の処理の流れはおおまかに分けて以下の4つになります。
- インプットダイアログを開き、出発駅、到着駅、定期代を入力してもらう
- Yahoo!路線情報の乗換案内のページを開き、入力されたインプット情報から検索する
- 検索結果をもとに取得したい情報を取得する
- 取得した情報をExcelファイルに書き込む
アウトプットを固める
Winautomationで処理を作っていく前に、最初にアウトプットを固めてしまいましょう。
最終的なイメージが見えていたほうが作りやすいです。
今回は下のようなアウトプットにしました。
これを値を消して綺麗にし、以下のようなテンプレートファイルを作りました。
ロボットで動かすときは、このテンプレートファイルをコピーし、値を書き込んでいけばよさそうです。
ロボット作成
準備ができたので、Winautomationでロボットを作成していきます。
Web Recorderを使って乗換案内ページの検索操作を作成する
まずはWebRecorderで検索操作を記録します。
乗換案内検索のFunctionを用意して、WebRecorderを起動します。
ブラウザはAutomation Browserを使用します。
乗換案内のページを開いて出発駅と到着駅を入れます。入れる文字は後で変数化するのでここでは何でも大丈夫です。
日時は指定した日時によって結果が変わらないように「指定なし」にします。
また表示順序は「料金が安い順」にしました。
間違えて操作してしまった場合には記録されたアクション右上の✖️で消し、綺麗にしておきます。
検索ボタンのクリックアクションを加えたら一旦[Finish]を押してアクション化します。
アクション化した後の画面です。ここで余分なものができていれば削除します。
一旦動作確認でデバッグ実行します。
Main Functionに[Run Function]を置いて作成したFunctionを実行するようにして実行します。
実行して結果を確認します。
無事検索結果が表示されましたが、ここでブラウザの画面が全画面になっていなかったので、全画面になるように変更します。
変数の値をWebページに入力させる
次に、出発駅と到着駅は変数の値から入力させるようにします。
変数設定はFunctionを分けたいので新しく用意しました。
[Set Variable]で出発駅と到着駅の変数を用意します。
最終的にはダイアログボックスから変数に代入させるようにしますが、一旦は固定値を入れておきます。
Web Recorderで記録した[Populate Text Field On Web Page]のプロパティで、先ほど設定した変数が代入されるようにします。
設定できたら、Main Functionに変数設定のFunctionを追加してデバッグして確認します。
これで検索操作の自動化ができました。Web Recorderを利用することで簡単に作成できます。
検索結果ページから取得する
次にWebページの検索結果を取得していきます。
新しく結果取得のFunctionを作り、Main Functionで乗換案内検索のFunctionの次にくるようにします。
今回はWebからの値取得はWeb Recorderを使わずに1つずつアクションを設定していきます。
1つずつアクションを設定することで、細かく取得内容を変更することができます。
取得したいの以下の項目です。
・ページのURL
・所要時間 ※3ルート分
・片道料金 ※3ルート分
・定期券金額(1ヶ月、3ヶ月、6ヶ月) ※3ルート分
・出発駅、到着駅、経由駅、および使用路線(交通手段) ※3ルート分
まずはページURLから取得していきます。
[Get Details of Web Page]を使えば簡単に取得できます。
このアクションを置いて、プロパティで[Operation]を「Get Web Browser’s Current URL Address」に変更します。
設定したら正しく取得できているかデバッグして確認します。
デバッグ後、%WebPageProperty%にURLが入っていることが確認できました。
これでURLの取得はOKです。
次に、ルートの所要時間や金額ですが、下の画像の赤枠で囲んだ部分でまとめて取得できそうなのでやってみます。
データ取得には[Extract Data from Web Page]のアクションを使います。
デフォルトだとExcelに結果が出力されるようになっているので、プロパティで[Store Extracted Records into] を「a Variable」にし、変数に入るようにしておきます。
[Specify Web Data to Extract]をクリックして設定画面を開きます。
少し面倒ですが、URL欄に乗換案内のURLを入力し、検索させます。
検索結果のページがが開いたら、まずは1つ目のルートの所要時間を取得します。
所有時間の上にマウスカーソルを合わせるとオレンジ色の枠が現れます。この状態で右クリックし、
[Extract Element Value] -> [Text “xxx”] と選択します。(xxxは所要時間)
画面右のExtraction Previewで取得されたデータが確認できます。
次に片道料金を同様に取得します。
さらに定期代の1ヶ月、3ヶ月、6ヶ月も同様に取得します。
定期代は「定期券」をクリックすると現れます。
経路についてはややこしいので、一旦飛ばします。
ルート1が終わったらルート2の所要時間を取得します。
すると自動で3ルート分取得してくれます。
規則性がある場合は自動で行ってくれるので便利ですね。
取得結果を見てみると、3ルート目の片道料金が抜けていますね。
ブラウザで比較してみると、片道料金の文字の色が異なっています。
さらに、Firefoxの開発ツールを使ってHTMLの構造を比較してみます。
左がルート1で、右がルート3です。
見比べてみると、ルート1では<span class=”mark”>の中に金額がありますが、
ルート3では<span class=”mark”>はなく、<li class=”fare”>の中に直接あります。
この違いによって、取得できないケースがあったわけですね。
どちらのパターンでも取得できるように、取得設定を変更してみます。
<li class=”fare”>の中身を全て取得し、不要な文字は削除する方針で作成していきます。
工具マークのボタンを押すと、取得内容を詳細に設定することができます。
詳細設定画面が表示されます。
CSS Selectorで取得したい箇所を設定します。
今回は以下のとおり設定しました。
CSS Selector 1: dl > dd:nth-child(2) > ul > li.time > span:last-child
CSS Selector 2: dl > dd:nth-child(2) > ul > li.fare
CSS Selector 3: dl > dd.option > div.detail.commuterPass > dl > dd > ul > li:nth-child(1) > span
CSS Selector 4: dl > dd.option > div.detail.commuterPass > dl > dd > ul > li:nth-child(2) > span
CSS Selector 5: dl > dd.option > div.detail.commuterPass > dl > dd > ul > li:nth-child(3) > span
「CSS Selector2」が片道料金を指定しているセレクタです。
「li.fare」は 「<li class=”fare”>」のことです。これで「<li class=”fare”>」な中身を全て取得します。
CSS Selectorの使い方についてはややこしいので、別の記事で説明したいと思います。
設定できたらデバッグして値が取得できているか確認します。
下の画像のように取得できていたら成功です。
今回はここまでです。
次回は取得した文字の整形や経路情報の取得について説明していきます。
前回に引き続き、Winautomationで作成したロボットについて紹介していきます。 前回は乗換案内から経路の所要時間や片道料金などを取得しました。 今回は取得した文字列から不要な文字を削除していきます。 取得した文字の[…]
前回に引き続き、Winautomationで作成したロボットについて紹介していきます。 前回は取得した情報を整形し、各ルートごとに分割しました。 今回は取得した情報をアウトプットに書き込んでいきます。 アウトプットファイルの用意 […]