RPAによるWebページの「繰り返しパターンデータの取得」(複数ページにまたがる表データなど)はUiPathでもAutomation Anywhereでも専用のコマンドが提供されており、『ちょっとだけ規則正しくない繰り返しパターンのデータスクレイピングを試してみた』で紹介したようにどちらも比較的簡単に実装できますが、繰り返しパターンからリンクされている各詳細ページの情報を取得していく場合は少々工夫が必要です。たとえば、一覧からリンクされているプロファイル情報、商品の詳細ページ、レシピの詳細ページ、などです。
今回の想定は上の図のような場合です。
一覧ページの繰り返しパターン取得は以下のようにUiPathもAutomation Anywhereもウィザードが用意されています。
データスクレイピングでとれるURLの「その先のページ」をスクレイピングしたい!
工夫すべきポイントの概要はこんなかんじです(^_-)-☆
- 専用のウィザードが用意されていないので、変数とループを使ったプログラミングが必要
- 変数を使えるフィールドが限られている場合があり、使えるコマンドが限定される場合がある
今回は、価格コムの売れ筋ランキングのページ (一覧ページ) からリンクがある、商品説明のページ (詳細ページ) をスクレイピングしてみようと思います。このプロセスがUiPathとAutomation Anywhereでどう異なるかを比べてみたいと思います!物事を簡単にするために、売れ筋ランキングのページの項目とURLは『ちょっとだけ規則正しくない繰り返しパターンのデータスクレイピングを試してみた』で紹介されている方法であらかじめExcel上に一覧になっているものとします。
用意されているデータと取り組み方針
以下のページから各商品のメーカー名、商品名とURLをスクレイピングしたものを表で用意します(^^)/
https://kakaku.com/pc/note-pc/ranking_0020/
例: d:\kakakucom.xlsx
(価格.comの場合は「価格.com - (メーカー名)(商品名) 価格比較」という文字列が詳細ページのタイトルになっています)
メーカー名 | 商品名 | URL |
---|---|---|
Dell | Inspiron 14 5000 プレミアム Ryzen 5・8GBメモリ・256GB SSD・Radeon Vega8搭載モデル | https://kakaku.com/item/K0001219355/ |
HP | Pavilion 13-an1000 価格.com限定 Core i5&256GB SSD&メモリ8GB&フルHD&タッチパネル搭載モデル | https://kakaku.com/item/J0000032156/ |
Lenovo | ThinkPad E595 価格.com限定 AMD Ryzen 5・8GBメモリー・256GB SSD・15.6型フルHD液晶搭載 20NFCTO1WW | https://kakaku.com/item/K0001197912/ |
マウスコンピューター | mouse F5-celeron-KK 価格.com限定 8GBメモリ/240GB SSD/15.6型フルHD液晶搭載モデル | https://kakaku.com/item/K0001227837/ |
HP | HP 14s-dk0000 価格.com限定 AMD A4/4GBメモリ/128GB SSD/14型フルHD液晶搭載 エントリーモデル | https://kakaku.com/item/K0001187273/ |
Dell | Inspiron 14 5000 プレミアム Core i5 10210U・8GBメモリ・256GB SSD搭載モデル | https://kakaku.com/item/J0000031138/ |
NEC | LAVIE Direct PM(X) 価格.com限定モデル Core i5・256GB SSD・8GBメモリ・13.3型フルHD液晶搭載 NSLKB684PXGZ1B | https://kakaku.com/item/K0001200883/ |
Lenovo | Ideapad S540 AMD Ryzen 5・8GBメモリー・256GB SSD・14型フルHD液晶搭載 81NH002PJP | https://kakaku.com/item/K0001157209/ |
HP | ENVY x360 15-ds000 価格.com限定 Ryzen 5&メモリ8GB&512GB SSD&フルHD&360度回転モデル | https://kakaku.com/item/K0001167362/ |
マイクロソフト | Surface Laptop 3 13.5インチ/Core i5/メモリ8GB/256GB SSD/Office Home and Business 2019付モデル | https://kakaku.com/item/J0000031430/ |
HP | Chromebook x360 14b-ca0000 価格.com限定 Pentium&メモリ8GB&64GB eMMC&フルHD・IPSタッチディスプレイ・360度回転搭載モデル | https://kakaku.com/item/K0001219097/ |
マイクロソフト | Surface Laptop 3 13.5インチ VGY-00018 | https://kakaku.com/item/K0001196626/ |
マウスコンピューター | m-Book K700SN-M2SH2-KK 価格.com限定 Core i7/16GBメモリ/256GB NVMe SSD+1TB HDD/MX250/15.6型フルHD液晶搭載モデル | https://kakaku.com/item/K0001183821/ |
マイクロソフト | Surface Pro 7 タイプカバー同梱 QWT-00006 | https://kakaku.com/item/K0001215612/ |
HP | Pavilion 15-cs3000 価格.com限定 Core i5&メモリ16GB&256GB SSD+1TB HDD搭載モデル | https://kakaku.com/item/J0000032120/ |
NEC | LAVIE Direct NS(A) 価格.com限定モデル AMD E2・500GB HDD・4GBメモリ搭載 NSLKB520NAFZ1B | https://kakaku.com/item/K0001139211/ |
Dell | Inspiron 15 3000 プレミアム Core i5 1035G1・8GBメモリ・256GB SSD搭載・Office Personal 2019付モデル(光学ドライブ付) | https://kakaku.com/item/J0000031404/ |
Lenovo | Lenovo YOGA S740 第10世代 Core i7・16GBメモリー・512GB SSD・14型フルHD液晶搭載 81RS0022JP | https://kakaku.com/item/K0001201571/ |
Lenovo | ThinkPad E495 価格.com限定 AMD Ryzen 5・8GBメモリー・256GB SSD・14型フルHD液晶搭載 パフォーマンス 20NECTO1WW | https://kakaku.com/item/K0001220791/ |
HUAWEI | HUAWEI MateBook D 15 BOHWAQHR8BNCNNUA | https://kakaku.com/item/K0001244972/ |
HP | ENVY x360 13-ar0000 価格.com限定 Ryzen 7&メモリ16GB&512GB SSD&フルHD&360度回転モデル | https://kakaku.com/item/J0000032092/ |
マウスコンピューター | NEXTGEAR-NOTE i5350SA1-M2SH2-KK 価格.com限定 Core i7/16GBメモリ/256GB NVMe SSD+1TB HDD/GTX1650/15.6型フルHD液晶搭載モデル | https://kakaku.com/item/K0001168554/ |
Lenovo | Ideapad S540 Core i5・8GBメモリー・256GB SSD・15.6型フルHD液晶搭載 81NE001BJP | https://kakaku.com/item/K0001151375/ |
マイクロソフト | Surface Pro タイプカバー同梱 KLG-00022 | https://kakaku.com/item/K0001057645/ |
HP | HP 14s-dk0000 価格.com限定 AMD Ryzen5/8GBメモリ/256GB SSD/14型フルHD液晶搭載 スタンダードモデル | https://kakaku.com/item/K0001187276/ |
Dell | Inspiron 13 7000 プレミアム Core i5 10210U・8GBメモリ・256GB SSD搭載モデル | https://kakaku.com/item/K0001188520/ |
HP | Pavilion 15-cs3000 価格.com限定 Core i7&メモリ16GB&256GB SSD+1TB HDD搭載モデル | https://kakaku.com/item/J0000032173/ |
Lenovo | IdeaPad L340 Ryzen 5 3500U・8GBメモリ・SSD256GB・非光沢フルHD液晶搭載モデル | https://kakaku.com/item/J0000032028/ |
Dell | Inspiron 15 3000 スタンダード Core i3 1005G1・1TB HDD搭載モデル | https://kakaku.com/item/J0000031336/ |
富士通 | FMV LIFEBOOK AH77/D3 2019年10月発表モデル | https://kakaku.com/item/J0000031606/ |
ASUS | E203MA 2019年10月発売モデル | https://kakaku.com/item/J0000031983/ |
マウスコンピューター | mouse F5-i5-KK 価格.com限定 Core i5/8GBメモリ/512GB SSD/15.6型フルHD液晶搭載モデル | https://kakaku.com/item/K0001227841/ |
詳細ページでは、一覧ページでは得られない「価格前週比」「価格帯」「メーカー直販サイトURL」の情報が得られるので、これらを得ることにします。
詳細ページの1つで得たい情報の部分をスクレイピングして、変数とループを使ってその他の同じレイアウトの一覧ページからも同じ部分をスクレイピングします。
UiPathの場合
利用環境: UiPath Studio 2020.4.0-beta.472
注: Studioのリボンにある「データスクレイピング」コマンドとかが使えそうと直感的には思うかもしれませんが、これは繰り返し要素がある場合にWebに限らず使うコマンドです。また、すぐ横の「画面スクレイピング」ではWeb上のテキスト取得はできますが、対象ウィンドウの変更ができないため、ここではアクティビティの中にある**「UI Automation」-「要素」-「制御」-「テキストを取得」(Uipath.Core.Activities.GetValue) や「UI Automation」-「要素」-「属性」-「属性を取得」**(Uipath.Core.Activities.GetAttribute) を使います。
詳細ページ上で必要な要素を変数に取得する
- 新規プロジェクトを作成、最初のURL
https://kakaku.com/item/K0001219355/
をInternet Explorerで開いておきます。またString型で変数を3つ作っておきます。
- アクティビティから「テキストを取得」を2つ、「属性を取得」を1つ、シーケンス内にドラッグ&ドロップします。
- その後「画面上で指定」をクリックして、Internet Explorer上でWebページ上のそれぞれの要素をクリックして指定します。
- シーケンスの最後に「メッセージボックス」を追加して、
variable1
、variable2
、variable3
の内容を表示します。
シーケンスを保存して実行すると、以下の通り、各要素が取得できていることがわかります。
処理する詳細ページを一般化する
最初の詳細ページでは必要な情報を取得する仕組みができたので、他の詳細ページでも同じ情報が取得できるようにシーケンスを一般化します。
- まず、新たに変数として
URL
とTitle
を追加します。既定値には最初の詳細ページのURLとWebページのタイトルを入れておきます。
- 次に、「UI Automation」-「ブラウザー」-「ブラウザーを開く」(UiPath.Core.Activities.OpenBrowser)をシーケンスに追加、URLプロパティには変数
URL
を入れておきます。そして、今まで作った3つの「テキストを取得」「属性を取得」アクティビティを「ブラウザーを開く」のコンテナーの中にドラッグ&ドロップします。
- 「テキストを取得」「属性を取得」アクティビティのそれぞれの**「セレクター」プロパティを開きます。最初のアクティビティのセレクターウィンドウでは、title属性に指定されているタイトルの代わりに
{{Title}}
と指定します。セレクターウィンドウの中では{{}}
**で囲まれた文字列は変数名とみなされます。また、aaname属性の中には固有の文字列が入っているためOFFにしておきます。(それによりセレクターにはomit:
という文字列が追加されます。) 2番目のアクティビティでも同様に変更します。
- 3番目のアクティビティはURLを取得するので指定方法が少し違い、aaname属性がないためtitle属性だけ同様に変数に変更します。
これで保存して実行すると、指定した最初の詳細ページがInternet Explorerで開いた後、以下が表示されます。
...「メーカー直販サイトURL」は正しく取得されていますが、残念ながら「価格前週比」「価格帯」は正しく取得されていません。
さらにセレクターを編集して正しいコントロールを選択できるようにする
さて、ここからはちょっと難しいですが、UiPathのセレクターの仕様を見ながら、セレクターの内容を最適化します。
まず、抜き出したい要素の近くのHTMLソースを見てみます。
<div id="priceBox" class="priceBoxWrap">
<div class="priceWrap">
<span class="newBrand">最安価格(税込):</span>
<div class="subInfoObj1">
<p>
<span class="priceTxt">¥52,830</span>
</p>
<div class="offer">
<span class="priceRate">(前週比:<span class="priceNovary">±0 </span><img width="12" height="12" src="https://img1.kakaku.k-img.com/images/itemview/item/icon_help2.gif" alt="" onclick="balloonOver()">)
<span style="display:none" id="balloonMini">
<span class="balloonMiniMain">7日前の最安価格との対比<a href="javascript:void(0)" onClick="balloonOut();return false;" title="閉じる"><img width="15" height="15" src="https://img1.kakaku.k-img.com/images/itemview/item/itemv_balloon_close.gif"></a>
</span>
</span>
</span>
<span class="priceRateG"><span class="priceRateLink"><a target="_blank" href="https://kakaku.com/item/K0001219355/pricehistory/">価格推移グラフ</a></span></span>
</div>
...
<div class="subInfoObj4">
<span>価格帯:<span itemprop="lowPrice">¥52,830</span>~<span itemprop="highPrice">¥52,830</span> (<a href="https://kakaku.com/item/K0001219355/#tab"><span itemprop="offerCount">1</span>店舗</a>)</span>
<span>メーカー希望小売価格:¥―</span>
</div>
HTMLソースを見てみると、それぞれのアクティビティで以下のようにセレクターを変更すればよいことがわかります。
<html title='{{Title}}' />
<webctrl class="priceRate" tag='SPAN' />
<html title='{{Title}}' />
<webctrl parentclass="subInfoObj4" tag='SPAN' />
これを保存して実行すると、以下の通り各要素が取得できていることがわかります。
これでセレクターの一般化ができました(^_-)-☆
Excelファイルの内容をデータテーブル変数に読み込む
全詳細ページについての情報が入っているd:\kakakucom.xlsx
を読み込んでUiPathのデータテーブル変数に読み込んでみましょう(^^)/
- まず
DataTable
という名前のデータテーブル変数を作成します。
-
「アプリの連携」-「Excel」「Excelアプリケーションスコープ」(UiPath.Excel.Activities.ExcelApplicationScope)をシーケンスの最初、「ブラウザーを開く」の前に挿入して「ブックのパス」プロパティに
d:\kakakucom.xlsx
を入力します。このコンテナーの中に**「アプリの連携」-「Excel」-「範囲を読み込み」**(UiPath.Excel.Activities.ExcelReadRange)をドロップします。Excelシート内のデータ範囲と、出力としてDataTable
を指定します。
これでExcelからの読み込み部分は完成です。
WebページタイトルとURLでループして詳細ページを切り替える仕組みを作る
読み込んだ詳細ページの数だけループを回してみましょう(^^)/
UiPathにおける繰り返し処理は**「ワークフロー」-「制御」にあるものが一般的ですが、データテーブル専用の繰り返し処理用アクティビティが「プログラミング」-「データテーブル」-「繰り返し(各行)」**(UiPath.Core.Activities.ForEachRow)にあるので、これを「Excelアプリケーションスコープ」と「ブラウザーを開く」の間にドラッグ&ドロップします。
そしてコレクションに'DataTable'を指定して、「ブラウザーで開く」と「メッセージボックス」を、この中の「Body」コンテナーの中にドラッグ&ドロップして移動します。
Bodyコンテナーの中の先頭に**「ワークフロー」-「制御」-「複数代入」**(Uipath.Core.Activities.MultipleAssign)を挿入して以下の式をそれぞれ代入します。
その後に「メッセージボックス」アクティビティを入れて、Title
とURL
に入った値を表示します。
Title="価格.com - " + iif(Left(row(1).ToString(),Len(row(0).ToString()))=row(0).ToString(),"",row(0).ToString()+" ").ToString()+row(1).ToString()+" 価格比較"
ちょっと複雑な式ですが、row(0), row(1) はゼロから始まるデータテーブル行の要素で、時々商品名の先頭にメーカー名が既に入っている場合があるので、それをチェックしてその場合は商品名を追加しないようにします。データテーブル行はObject型なので、.ToString()で文字列型に変換する必要があることに注意してください。また、iif関数も最後は.ToString()で文字列型に変換する必要があります。
URL=row(2).ToString()
row(2)はURLの要素なので、URL
に代入します。
以上で読み込み部分は完成です。
CSVファイルへの結果の書き込みを行う
さて、詳細ページから得られた情報variable1
、variable2
、variable3
ですが、DataTable
に列を3つ追加して格納したうえでd:\kakakucom_output.csv
にCSVファイルとして書き込むことにします。
- 「Excelアプリケーションスコープ」と「繰り返し」の間に**「プログラミング」-「データテーブル」-「データ列を追加」**(UiPath.Core.Activities.AddDataColumn)を3つ追加して、入力にデータテーブル=
DataTable
、TypeArgument="String"、列名は「価格前週比」「価格帯」「メーカー直販サイトURL」を指定します。
- 「繰り返し」の後、シーケンスの最後に**「アプリの連携」-「CSV」-「CSVに書き込み」**(UiPath.CSV.Activities.WriteCsvFile)を追加します。
- 繰り返し内の現在の位置を指し示すInt32型変数
idx
を作成し、「繰り返し」の出力の「現在のインデックス」に指定します。
- 「繰り返し」の中、「Body」コンテナーの「ブラウザーを開く」の後ろに「複数代入」アクティビティを挿入。
以下の代入を行います。
DataTable(idx)(3)=variable1
DataTable(idx)(4)=variable2
DataTable(idx)(5)=variable3
データテーブル変数の要素への参照は**DataTable(行)(列)
**のように行います。インデックスはいずれもゼロから始まります。
また、繰り返しInternet Explorerが起動するとウィンドウが多くなりすぎて邪魔なので、ブラウザーは終わったら消すことにします。ブラウザー変数 (UiPath.Core.Browser) Browser
を定義して、「ブラウザーを開く」アクティビティの出力「UIブラウザー」プロパティに指定しておきます。
また、「ブラウザーを開く」の後ろに**「タブを閉じる」**(UiPath.Core.Activities.CloseTab)を挿入、入力「ブラウザー」プロパティにBrowser
変数を指定します。
これで保存して実行してみましょう(^_-)-☆
ページによっては要素が存在しない場合のエラー処理を加える
1ページ目、2ページ目とブラウザーが開いて実行されていきますが、今回の場合、2ページ目の途中で以下のエラーで止まってしまいます。
これは2ページ目には「価格帯」の情報がないためです。このように、「テキストを取得」「属性を取得」アクティビティは、要素がないときにエラーが出てしまいますので、3つとも、プロパティで「エラー発生時に実行を継続」=trueと指定しておきましょう。また、エラーが発生すると既定だと10秒くらい待ってしまうので、タイムアウトを2000ms (2秒)くらいに設定しておきましょう(^_-)-☆
また、「ブラウザーを開く」の一番最初で、ループ毎に変数を空にして初期化するようにします。
完成!
これですべて完成です。「メッセージボックス」アクティビティはコメントアウトしておきましょう。
シーケンスは以下の通りになります。
"Scraping"プロジェクトをGitHubからダウンロードする
保存して実行すると、d:\kakakucom_output.csv
に以下のようなCSVファイルができています。
Automation Anywhereの場合
利用環境: Automation Anywhere Enterprise 11.3.3.1 (Build 19100531)
ちょっと記事が長くなったので、次回に分けて今度はAutomation Anywhereの場合について解説します(^^♪