こんにちは、ホームスタッフサービスのK田です。
今回もUiPathのご紹介をさせていただきます。
RPAツールの「UiPath」を使って「Amazonにある書籍の価格を調べる」ことをやってみる。前回はUiPathの紹介と実行結果の紹介を行いました。
「トライRPA! UiPathで本の価格調査 Part.1」
今回はそのPart.2です。
今回やること
今回行うことを説明する前に、全体の工程を大きく4つに分けたいと思います。
- 初期設定……ワークフローで使う変数の設定と準備
- 価格のスクレイピング……AmazonのHPから価格を取得して整形
- Excelへの書き込み……結果を書き込むExcelを開いて目標の行に変数を書き込む
- ウインドウを閉じる……AmazonのHPを閉じる。
以上の4つです。今回は「1.」と「2.」をやってみます。UiPath上での各工程がどこに当たるのかを図示してみました。黄色枠が今回の工程「1.」と「2.」に相当します。
初期設定
まずはUiPathの本作業で使用する変数の作成と初期設定を行います。本作業で使用する変数は次の通りです。
既定値を設定する
出力あるいは入力するファイル指定を行う際にファイル位置を表すフルパスの指定が必要です。変数「save_excel_file_name」に既定値として設定しておけば、次回から長いフルパスを入力せずに済みます。
ここで便利機能!変数名の変更
ここで便利な機能を1つご紹介します。
途中で変数の名前を変えたいことも出てくるかと思います。下図の赤枠部分の変数名を1つ変更すれば、同じワークフロー内で使用されている同じ名前の変数はすべて自動修正されます。ワークフロー内の変数を1つずつ変更しなくて済みますのでメンテナンスも非常にラクになります。
例えば、変数「test」をアクティビティ(代入)で2カ所で使用していたとします。途中で変更する場合は使用している変数をそれぞれ変更する必要がありますが、変数自体の名称(赤枠部分)を「test」「test2」変更しますと、
変数名1つを変更しただけでアクティビティ(代入)の「test」も「test2」へ変更されました。
同じワークフロー内で同じ変数を複数回使用している場合は、こちらの機能を使うと非常にラクです。ぜひご使用ください。
現在日時の取得する
次に価格調査した日時を取得します。ワークフローのシーケンス「準備(変数の定義)」が該当します。
現在日時を取得する関数式は以下の通りです。書式部分は任意で指定できます。
Now.ToString(書式)
現在の日時を「Now.ToString(“yyyy/MM/dd HH:mm:ss”)&”取得”」という文字列に変換し、「price_date」という変数に格納しておきます。
現在時刻が「2020年9月3日 午後6時32分3秒」の場合、「2020/09/03 18:32:03取得」の形式で日時が取得できます。
Excel側の設定をする
出力用Excelファイルは下図のように、あらかじめ見出しを設定した先頭行だけのファイルを作成しておきます。
以上で初期設定は終了です。
Amazonから価格をスクレイピングする
WorkFusionで価格を取得した時と同様に、UiPathでも「AmazonのWebページ」から必要な情報を取得していきます。
収集対象と手順の概略
対象はWorkFusionで取得したものと同じタイトルです。
この本のKindle版の価格と、単行本版の価格を取得します。今回は同じページからKindle版と単行本版を取得する手順で行います。
ウェブサイトを開く
まずはKindle版の価格を取得します。
UiPathでウェブサイト(ブラウザ)を開くには、アクティビティ「ブラウザを開く」をシーケンス「HPの情報をスクレイピングする」内にドラッグします。
次に、赤枠内に開きたいサイトのURLを入力します。文字列を入力する際は文字列の始まりと終わりを「””」ダブルクォーテーションで挟みます。
これでAmazonのHPを開くことができます。
今回はブラウザ(Google Chrome)を使用していますが、Google Chrome以外のブラウザを指定することもできます。
「プロパティ」赤枠内の「ブラウザの種類」にて、ブラウザ(Google Chrome、Internet Explorer、Firefox、Microsoft Edge)を選択できます。
画像認識により価格を取得する
先ほどAmazonのHPを開きましたので、開いたHPの中で本の価格の取得します。
UiPathの操作としては、「ブラウザを開く」の範囲内で本の価格を取得する「テキストを取得」を動かすイメージです。
「ブラウザを開く」は赤枠が範囲となりますので、本の価格を取得する「テキストを取得」を黄色枠「シーケンス」の内側にドロップします。
これで本の価格を取得する「テキストを取得」の準備ができました。次に値を取る場所の指定を行います。
UiPathでは画像認識による指定を行います。UiPathでは画像認識させると、セレクターと呼ばれるコードの指定も同時に行っています。そのため、将来HPの画像が変わっても、セレクターの設定を変更することによって対応可能です。
「テキストを取得」の赤枠をクリックします。
次に赤枠内の「画面上で指定」を選択します。
画面全体が薄い青色に着色され、手印キーを動かすと、セレクター部分が薄い青色に着色されます。
Kindle版の価格を取得したいので、赤枠内の「\1,045」を選びます。
「テキストを取得(Kindle版を取得)」は設定前は「ブラウザー内で要素を指定」とありましたが、下図のように選択した画像が入力されました。
これで場所の指定についての説明は完了です。その後、取得したテキスト(Kindle版の価格)を変数「price_kindle」に格納します。プロパティの出力の赤枠内を設定すれば完了です。
取得した値の整形と数字へ変換する
整形とは、目的に応じて関数などを用いて変換することを言います。例えば、半角文字を全角文字への変換、スペースや改行の削除、置換などです。
先程取得した価格はもちろんそのままでも良いのですが、より適切な形に整形したいと思います。具体的には、
-
- 全角から半角へ変換
- 改行の削除
- 冒頭の「¥」(全角円マーク)を削除
- 「,」(半角カンマ)を削除
を行います。
全角から半角へ変換する
まずは「全角から半角へ変換」を行うために「StrConv」関数を使います。StrConv関数は文字列の種類(半角、全角、ひらがな、カタカナ等)を変換する関数です。
アクティビティ「代入」を使用します。左辺に格納する変数、右辺に変換する関数式を入力します。
StrConv(変換する文字列, VbStrConv.Narrow)
「変換する文字列」のところに「変換したい文字列」を入力すれば、全角から半角へ変換できます。今回は先ほど取得した変数「price_kindle」を入力しますので下記のようになります。
左辺=price_kindle
右辺=StrConv(price_kindle, VbStrConv.Narrow)
これで変数「price_kindle」は半角へ変換できました。
改行を削除する
次に「改行の削除」を行うために「Replace」関数を使います。Replace関数は、文字列中にある文字を別の文字に置き換える関数です。
アクティビティ「代入」を使用します。左辺に格納する変数、右辺に置換する関数式を入力します。
変換する文字列.Replace(Chr(13), "").Replace(Chr(10),"")
「変換する文字列」のところに「変換したい文字列」を入力すれば、全角から半角へ変換できます。今回は先ほど取得した変数「price_kindle」を入力しますので下記のようになります。
左辺=price_kindle
右辺=price_kindle.Replace(Chr(13), “”).Replace(Chr(10),””)
※Chr(10)はラインフィード文字、Chr(13)はキャリッジリターン文字となります。
※Chr(10)とChr(13)なので「CrLf」(改行)と同じ意味となります。
※改行「””」(空欄)に変更するという意味になるので、結果的に改行を削除するということになります。
これで変数「price_kindle」の改行が削除できました。
¥を削除する
次に「¥の削除」を行うために「Replace」関数を使います。
アクティビティ「代入」を使用します。左辺に格納する変数、右辺に変換する関数式を入力します。
変換する文字列A.Replace("変換前の文字列B","変更後の文字列C")
- 変換する文字列A…「変換したい文字列」を入力します。今回は変数「price_kindle」になります。
- 変換前文字列B…「変換前の文字列」を入力します。今回は「\」を削除したいので、「¥」となります。
- 変換後文字列C…「変換後の文字列」を入力します。今回は削除したいので「””」となります。
以上のことを踏まえまして出来上がった関数式が下記となります。
左辺=price_kindle
右辺=price_kindle.Replace(“\”,””)
これで変数「price_kindle」の「¥」が削除できました。
「,」(半角カンマ)の削除も同じ関数式を使って行います。
左辺=price_kindle
右辺=price_kindle.Replace(“,”,””)
「\」の部分が「,」に変わったということです。
これで変数「price_kindle」の「,」が削除できました。
テストと実行結果を確認する
これまでのワークフローが正しく動作するか、テストして確認してみます。
完成形では実行結果をExcelファイルに出力しますが、今回はそこまで至っていません。なんらかの形で取得結果を表示したいのですが、今回はアクティビティ「メッセージボックス」を使ってみます。
アクティビティ「メッセージボックス」は指定した文字列を表示することができます。確認のために表示させたいときに便利です。
今回は変数「price_kindle」と「price_book」が正しく取得できているどうかを確認しますので、メッセージボックスに入力します。
作成したロボットをスタートするには、「ファイルをデバッグ」ボタンを押します。
メッセージボックスにてKindle版の価格「1045」が確認できました。「OKボタン」をクリックしますと、続いて
メッセージボックスにて単行本版の価格「1100」が確認できました。これで価格は取得できているようです。
作成時にメンテナンスを考慮しておく
ロボット作成直後は記憶も新しいのでロボット作成者も内容を覚えていますが、時間が経ちますと忘れてしまいます。また他者に提供する場合、シーケンスやアクティビティの名称を関連するものに設定しておけばメンテナンスしやすい上に、働きもおおよそ理解することができます。よって関連する名称に変えておくことをお勧めします。
関連する名称に変更済みの「価格スクレイピング」のワークフローが下図となります。
まとめ
以上により
- Amazonで価格を取得したい本の該当ページを開く
- Kindle版と書籍版の価格を取得する
- それぞれを変数に格納して整形する
までのワークフローができました。
今回は画像認識による指定を行いましたが、それ以外に位置を指定する方法もあります。WorkFusionではXPathで指定していたように、UiPathではHTMLタグの要素を使って指定することも可能です。
アクティビティの組み合わせによってワークフローが完成していく工程を実感いただけたでしょうか。
次回は残りの工程となる「取得した価格をExcelファイルに書き出す」ことを見ていきます。