こんにちは、M田です。
RPAを使って「Amazonにある書籍の価格を調べる」ことをやってみる。前回はWorkFusionの紹介と、実行結果の紹介を行いました。

トライRPA! WorkFusionで本の価格調査 Part.1

今回はそのPart.2です。

今回やること

今回行うことを説明する前に、まずは全体の工程を大きく3つに分けたいと思います。すなわち、

  1. 初期設定……レコーディングで使う変数の設定と準備
  2. 価格のスクレイピング……AmazonのHPから価格を取得して整形
  3. Excelへの書き込み……結果を書き込むExcelを開いて目標の行に変数を書き込む

以上の3つです。今回は「1.」と「2.」をやってみます。
WorkFusion上での各工程がどこに当たるのかを図示してみました。

今回実装する範囲

※クリックで大きな画像が開きます

初期設定

まずは本作業で使用する変数の作成と初期設定を行います。
本作業で使用する変数は次の通りです。

使用する変数一覧

出力用のExcelファイルは、あらかじめ見出しを設定した先頭行だけのファイルを作成しておきます。

出力用Excelファイルの用意

出力用Excelファイル名は、「Shift押しながら右クリック>パスのコピー」でファイルのフルパスがコピーされます。これを利用してWorkFusionに貼り付けるとラクです。このときに前後「」で囲まれた状態で貼付けされますが、「」は消去しておいてください。

Excelに書き込む本の価格を取得した日時をここで少し加工しておきます。アクションライブラリの中の「Variables」>「定数値」で、実行時の日付を「date_today」に格納します。

現在の日付を変数にセット

※クリックで大きな画像が開きます

次に実行時の日付を、「yyyy/mm/dd HH:mm 記録」という文字列に変換し、「price_date」という変数に格納しておきます。

日付のフォーマットを変換して変数に格納

※クリックで大きな画像が開きます

以上で初期設定は終了です。

Amazonから価格をスクレイピング

いよいよAmazonのWebページから必要な情報を取得していきます。

収集対象と手順の概略

対象のタイトルはこちらです。

マンガで読み解く 人を動かす

※クリックで大きな画像が開きます

カーネギーの名著「人を動かす」の公認マンガです。この本のKindle版の価格と、単行本の価格を取得します。

同じページからKindle版と単行本が取得できますが、今回は、

  1. Kindle版のURLからページを開き、価格を取得。
  2. 単行本版のURLからページを開き、価格を取得。

という手順でやっていきます。
ほとんど同じ手順を2回繰り返すことになりますので、少し冗長ではあります。しかしながら将来、単行本版の在庫のチェックもやりたくなったときなどには修正箇所が少なくて済みそうです。

ウェブサイトを開く

まずはKindle版の価格を取得します。

WorkFusionでウェブサイトを開くには、アクションライブラリ内の「ウェブ」>「ウェブサイトを開く」アクションを、アクションフローにドラッグします。

ウェブサイトを開く

※クリックで大きな画像が開きます

サイトのURL欄にKindle版のURLを入力します。
また、回線の調子などですぐにページが表示されない場合に備えて「タイムアウト」に「10000」を入力しておきます。単位はミリ秒なので、最大10秒まで表示されるのを待ってくれます。

XPathの取得と価格の取得

該当ページを開いたら価格の取得をします。
アクションライブラリ内の「ウェブ」>「ウェブの要素」アクションを、アクションフローにドラッグします。

ウェブの要素を取得

※クリックで大きな画像が開きます

このとき、さきほど設定した「ウェブサイトを開く」の上にドラッグすることで、一段右に寄せられた状態、つまり「ウェブサイトを開く」の入れ子になります。
入れ子にすることにより、開いているページに対して「ウェブの要素」を指定することになります。

アクションフローに配置したアクションは、ドラッグで移動することで入れ子にしたり、外に出したりすることができます。「ウェブサイトを開く」の入れ子にならなかった場合は、ドラッグして調整してください。

価格を取得するのでモードは「値を取得」にセットします。
価格を取得するためには、開いているページ上での位置を指定しなければなりません。ページ上の位置は「要素のXPath」で指定します。

ウェブページの内容はHTMLという言語で記述されています。HTMLはツリー状の構造となっているため、まるでカーナビの案内のように目的の位置(これを要素と言います)への道順をまとめることができます。XPathは目的の要素への道順を表現したものです。

そのXPathを取得するためにはどうすればよいでしょうか? 以下はChromeの例です。

価格の上で右クリックから「検証」

今回の場合は価格を取得するので、価格の上で右クリックして「検証」をクリックします。
デベロッパーツールのウィンドウが開きます。既定では右側に表示されるので、下側に表示するようにすると見やすいかもしれません。

XPathをコピーする

※クリックで大きな画像が開きます

対象の要素がハイライト表示されますので、さらに右クリックします。「Copy」>「Copy XPath」でクリップボードに取得対象のXPathがコピーされます。
F12キーを押してデベロッパーツールを閉じます。

WorkFusionの画面に戻り、「設定」の「要素のXPath」欄に、右クリック>貼り付けなどで、クリップボードに保存されているXPathを貼り付けます。

最後に取得した値を変数に保存します。「出力」欄のドロップダウンから保存する変数を選択します。
ここでは「price_temp」に保存します。

取得した値の整形と数字への変換

先程取得した価格はもちろんそのままでも良いのですが、より適切な形に変換したいと思います。具体的には、

  • 冒頭の「」(全角円マーク)を削除
  • 文字列から数値に変換

を行います。

「¥」の削除

まずは「¥」の削除から行います。
アクションライブラリ内の「テキスト」>「テキストを置換」をアクションフローにドラッグします。入力のドロップダウンで、さきほど価格を取得して格納した「price_temp」を選択します。

検索するテキスト」には「」(全角円マーク)を入力します。「次のテキストで置換する」は入力せずに空欄のままとします。こうすることで、「¥マークを何もない文字で置換する」=「¥マークを削除する」という結果になります。

変換した結果を格納する変数として「price_temp」をドロップダウンから選択します。

「¥」の削除

※クリックで大きな画像が開きます

入力と出力に同じ「price_temp」を利用していますが、この変数は一時的に使用する作業用の変数なので再利用しています(「price_temp」は書籍版の価格取得でも再利用しています)。

文字列から数値への変換

次に文字列の変数「price_temp」を数値に変換します。
アクションライブラリ内の「Variables」>「数値フォーマット」をアクションフローにドラッグします。そして「文字列を数値に変換」のラジオボタンを選択します。

入力文字列には「price_temp」を入力しますが、ここはドロップダウンではなく手入力です。変数を入力するときは、

${(変数名)}

のように「${」と[「}」で囲みます。いずれも半角です。
変換する形式として「#,##0」を入力します。これは3桁ごとに「,」で区切る、整数の値です。

以上で数値に変換できたので、その結果を出力のドロップダウンから「price_kindle」を選択し、格納します。

文字列を数値に変換する

※クリックで大きな画像が開きます

書籍版の価格の取得

以上でKindle版の価格を「price_kindle」に格納する一連の処理ができました。
書籍版の価格の取得をするには、Kindle版の取得と同じ手順を設定していきます。変更する点は次の点です。

  • 「ウェブサイトを開く」の「サイトのURL」を書籍版に変更する。
  • 「ウェブの要素」の「要素のXPath」を変更する。
  • 「数値フォーマット」で出力する変数を「price_book」に変更する。

これで書籍版の価格も取得できるはずです。

ところでこのようにホームページ(Webページ)から情報を収集・抽出することを「スクレイピング」と言います。スクレイピングはRPAツールが得意なことの一つです。

テストと結果の確認

ここまでできた時点で、一度動作を確認してみましょう。レコーディングを再生「レコーディングを再生」をクリックして実行してみます。

進行状況

進行状況が表示されて、自動的にAmazonのページが開いて閉じる様子が見られると思います。しばらくしてWorkFusionの元の画面が再び表示されれば、エラーがなく処理が終了したことになります。

ただ、これだけでは価格が取得できたかどうかがわかりません。「正常に処理が終了した」ということがわかるだけです。確認する方法はないでしょうか?

WorkFusionはプロジェクトのフォルダ内に「execution-result.log.csv」というcsvファイルを作成し、処理の途中の変数の様子を記録していきます。このファイルの中身を見れば、価格が取得できたかどうかが確認できそうです。

execution-result.log.csvの中身の確認

※クリックで大きな画像が開きます

Kindle版の価格「1045」、書籍版の価格「1100」が取得できています。ここまでの動作については問題なさそうです。

まとめ

以上により、Amazonで価格を取得したい本の該当ページを開き、Kindle版と書籍版の価格を取得し、それぞれを変数に格納することができました。

ポイントとなるのは、「ウェブページ内の値を取得するためには位置を指定する必要がある。指定にはXPathを使う。」ということです。
XPathによる要素の指定は、ウェブページ内に値を「セットする」ことにも利用できます。Web操作の自動実行をするのに利用されることが多いので、機会があるときに調べておくと良いと思います。

価格の整形として「¥」のカットや文字列から数値の変換をやっていますが、このあたりはそれぞれの事情で不要だったり、または更なる変換が必要だったりするかもしれません。

次回は残りの工程となる「取得した価格をExcelファイルに書き出す」ことを見ていきます。