4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【🔥UiPath vs Automation Anywhere🔥】同一書式の複数Webページから情報を抜き出す (1) - UiPathの場合

Last updated at Posted at 2020-04-18

RPAによるWebページの「繰り返しパターンデータの取得」(複数ページにまたがる表データなど)はUiPathでもAutomation Anywhereでも専用のコマンドが提供されており、『ちょっとだけ規則正しくない繰り返しパターンのデータスクレイピングを試してみた』で紹介したようにどちらも比較的簡単に実装できますが、繰り返しパターンからリンクされている各詳細ページの情報を取得していく場合は少々工夫が必要です。たとえば、一覧からリンクされているプロファイル情報、商品の詳細ページ、レシピの詳細ページ、などです。
image.png
:arrow_up:今回の想定は上の図のような場合です。

一覧ページの繰り返しパターン取得は以下のようにUiPathもAutomation Anywhereもウィザードが用意されています。
image.png

データスクレイピングでとれるURLの「その先のページ」をスクレイピングしたい!

工夫すべきポイントの概要はこんなかんじです(^_-)-☆

  • 専用のウィザードが用意されていないので、変数とループを使ったプログラミングが必要
  • 変数を使えるフィールドが限られている場合があり、使えるコマンドが限定される場合がある

今回は、価格コムの売れ筋ランキングのページ (一覧ページ) からリンクがある、商品説明のページ (詳細ページ) をスクレイピングしてみようと思います。このプロセスがUiPathとAutomation Anywhereでどう異なるかを比べてみたいと思います!物事を簡単にするために、売れ筋ランキングのページの項目とURLは『ちょっとだけ規則正しくない繰り返しパターンのデータスクレイピングを試してみた』で紹介されている方法であらかじめExcel上に一覧になっているものとします。

用意されているデータと取り組み方針

以下のページから各商品のメーカー名、商品名とURLをスクレイピングしたものを表で用意します(^^)/
https://kakaku.com/pc/note-pc/ranking_0020/
image.png

例: 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つで得たい情報の部分をスクレイピングして、変数とループを使ってその他の同じレイアウトの一覧ページからも同じ部分をスクレイピングします。
image.png

UiPathの場合

利用環境: UiPath Studio 2020.4.0-beta.472

注: Studioのリボンにある「データスクレイピング」コマンドとかが使えそうと直感的には思うかもしれませんが、これは繰り返し要素がある場合にWebに限らず使うコマンドです。また、すぐ横の「画面スクレイピング」ではWeb上のテキスト取得はできますが、対象ウィンドウの変更ができないため、ここではアクティビティの中にある**「UI Automation」-「要素」-「制御」-「テキストを取得」(Uipath.Core.Activities.GetValue) や「UI Automation」-「要素」-「属性」-「属性を取得」**(Uipath.Core.Activities.GetAttribute) を使います。
image.png

詳細ページ上で必要な要素を変数に取得する

  1. 新規プロジェクトを作成、最初のURL https://kakaku.com/item/K0001219355/ をInternet Explorerで開いておきます。またString型で変数を3つ作っておきます。
    image.png
  2. アクティビティから「テキストを取得」を2つ、「属性を取得」を1つ、シーケンス内にドラッグ&ドロップします。
    image.png
  3. その後「画面上で指定」をクリックして、Internet Explorer上でWebページ上のそれぞれの要素をクリックして指定します。
    image.png
  4. シーケンスの最後に「メッセージボックス」を追加して、variable1variable2variable3の内容を表示します。
    image.png
    シーケンスを保存して実行すると、以下の通り、各要素が取得できていることがわかります。
    image.png

処理する詳細ページを一般化する

最初の詳細ページでは必要な情報を取得する仕組みができたので、他の詳細ページでも同じ情報が取得できるようにシーケンスを一般化します。

  1. まず、新たに変数としてURLTitleを追加します。既定値には最初の詳細ページのURLとWebページのタイトルを入れておきます。
    image.png
  2. 次に、「UI Automation」-「ブラウザー」-「ブラウザーを開く」(UiPath.Core.Activities.OpenBrowser)をシーケンスに追加、URLプロパティには変数URLを入れておきます。そして、今まで作った3つの「テキストを取得」「属性を取得」アクティビティを「ブラウザーを開く」のコンテナーの中にドラッグ&ドロップします。
    image.png
  3. 「テキストを取得」「属性を取得」アクティビティのそれぞれの**「セレクター」プロパティを開きます。最初のアクティビティのセレクターウィンドウでは、title属性に指定されているタイトルの代わりに{{Title}}と指定します。セレクターウィンドウの中では{{}}**で囲まれた文字列は変数名とみなされます。また、aaname属性の中には固有の文字列が入っているためOFFにしておきます。(それによりセレクターにはomit:という文字列が追加されます。) 2番目のアクティビティでも同様に変更します。
    image.png
  4. 3番目のアクティビティはURLを取得するので指定方法が少し違い、aaname属性がないためtitle属性だけ同様に変数に変更します。
    image.png

これで保存して実行すると、指定した最初の詳細ページがInternet Explorerで開いた後、以下が表示されます。
image.png

...「メーカー直販サイトURL」は正しく取得されていますが、残念ながら「価格前週比」「価格帯」は正しく取得されていません。

さらにセレクターを編集して正しいコントロールを選択できるようにする

さて、ここからはちょっと難しいですが、UiPathのセレクターの仕様を見ながら、セレクターの内容を最適化します。

まず、抜き出したい要素の近くのHTMLソースを見てみます。

HTMLソース(id="priceBox"付近を抜粋)
<div id="priceBox" class="priceBoxWrap">
  <div class="priceWrap">
    <span class="newBrand">最安価格(税込):</span>
    <div class="subInfoObj1">
      <p>
        <span class="priceTxt">&yen;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">&yen;52,830</span><span itemprop="highPrice">&yen;52,830</span> (<a href="https://kakaku.com/item/K0001219355/#tab"><span itemprop="offerCount">1</span>店舗</a>)</span>
    <span>メーカー希望小売価格:&yen;</span>
  </div>

HTMLソースを見てみると、それぞれのアクティビティで以下のようにセレクターを変更すればよいことがわかります。

1つ目のアクティビティ-変更後:parentid="priceBox"をやめてclass="priceRate"を入れる
<html title='{{Title}}' />
<webctrl class="priceRate" tag='SPAN' />
2つ目のアクティビティ-変更後:parentid="priceBox"をやめてparentclass="subInfoObj4"を入れる
<html title='{{Title}}' />
<webctrl parentclass="subInfoObj4" tag='SPAN' />

これを保存して実行すると、以下の通り各要素が取得できていることがわかります。

image.png

これでセレクターの一般化ができました(^_-)-☆

Excelファイルの内容をデータテーブル変数に読み込む

全詳細ページについての情報が入っているd:\kakakucom.xlsxを読み込んでUiPathのデータテーブル変数に読み込んでみましょう(^^)/

  1. まずDataTableという名前のデータテーブル変数を作成します。
    image.png
  2. 「アプリの連携」-「Excel」「Excelアプリケーションスコープ」(UiPath.Excel.Activities.ExcelApplicationScope)をシーケンスの最初、「ブラウザーを開く」の前に挿入して「ブックのパス」プロパティにd:\kakakucom.xlsxを入力します。このコンテナーの中に**「アプリの連携」-「Excel」-「範囲を読み込み」**(UiPath.Excel.Activities.ExcelReadRange)をドロップします。Excelシート内のデータ範囲と、出力としてDataTableを指定します。
    image.png

これでExcelからの読み込み部分は完成です。

WebページタイトルとURLでループして詳細ページを切り替える仕組みを作る

読み込んだ詳細ページの数だけループを回してみましょう(^^)/
UiPathにおける繰り返し処理は**「ワークフロー」-「制御」にあるものが一般的ですが、データテーブル専用の繰り返し処理用アクティビティが「プログラミング」-「データテーブル」-「繰り返し(各行)」**(UiPath.Core.Activities.ForEachRow)にあるので、これを「Excelアプリケーションスコープ」と「ブラウザーを開く」の間にドラッグ&ドロップします。

そしてコレクションに'DataTable'を指定して、「ブラウザーで開く」と「メッセージボックス」を、この中の「Body」コンテナーの中にドラッグ&ドロップして移動します。
image.png

Bodyコンテナーの中の先頭に**「ワークフロー」-「制御」-「複数代入」**(Uipath.Core.Activities.MultipleAssign)を挿入して以下の式をそれぞれ代入します。

その後に「メッセージボックス」アクティビティを入れて、TitleURLに入った値を表示します。

Title
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
URL=row(2).ToString()

row(2)はURLの要素なので、URLに代入します。

以上で読み込み部分は完成です。

CSVファイルへの結果の書き込みを行う

さて、詳細ページから得られた情報variable1variable2variable3ですが、DataTableに列を3つ追加して格納したうえでd:\kakakucom_output.csvにCSVファイルとして書き込むことにします。

  1. 「Excelアプリケーションスコープ」と「繰り返し」の間に**「プログラミング」-「データテーブル」-「データ列を追加」**(UiPath.Core.Activities.AddDataColumn)を3つ追加して、入力にデータテーブル=DataTable、TypeArgument="String"、列名は「価格前週比」「価格帯」「メーカー直販サイトURL」を指定します。
    image.png
  2. 「繰り返し」の後、シーケンスの最後に**「アプリの連携」-「CSV」-「CSVに書き込み」**(UiPath.CSV.Activities.WriteCsvFile)を追加します。
    image.png
  3. 繰り返し内の現在の位置を指し示すInt32型変数idxを作成し、「繰り返し」の出力の「現在のインデックス」に指定します。
    image.png
    image.png
  4. 「繰り返し」の中、「Body」コンテナーの「ブラウザーを開く」の後ろに「複数代入」アクティビティを挿入。
    image.png
    以下の代入を行います。
DataTable(idx)(3)
DataTable(idx)(3)=variable1
DataTable(idx)(4)
DataTable(idx)(4)=variable2
DataTable(idx)(5)
DataTable(idx)(5)=variable3

データテーブル変数の要素への参照は**DataTable(行)(列)**のように行います。インデックスはいずれもゼロから始まります。

また、繰り返しInternet Explorerが起動するとウィンドウが多くなりすぎて邪魔なので、ブラウザーは終わったら消すことにします。ブラウザー変数 (UiPath.Core.Browser) Browserを定義して、「ブラウザーを開く」アクティビティの出力「UIブラウザー」プロパティに指定しておきます。
image.png
また、「ブラウザーを開く」の後ろに**「タブを閉じる」**(UiPath.Core.Activities.CloseTab)を挿入、入力「ブラウザー」プロパティにBrowser変数を指定します。

これで保存して実行してみましょう(^_-)-☆

ページによっては要素が存在しない場合のエラー処理を加える

1ページ目、2ページ目とブラウザーが開いて実行されていきますが、今回の場合、2ページ目の途中で以下のエラーで止まってしまいます。
image.png

これは2ページ目には「価格帯」の情報がないためです。このように、「テキストを取得」「属性を取得」アクティビティは、要素がないときにエラーが出てしまいますので、3つとも、プロパティで「エラー発生時に実行を継続」=trueと指定しておきましょう。また、エラーが発生すると既定だと10秒くらい待ってしまうので、タイムアウトを2000ms (2秒)くらいに設定しておきましょう(^_-)-☆
image.png

また、「ブラウザーを開く」の一番最初で、ループ毎に変数を空にして初期化するようにします。
image.png

完成!

これですべて完成です。「メッセージボックス」アクティビティはコメントアウトしておきましょう。
シーケンスは以下の通りになります。
image.png

"Scraping"プロジェクトをGitHubからダウンロードする

保存して実行すると、d:\kakakucom_output.csvに以下のようなCSVファイルができています。
image.png

Automation Anywhereの場合

利用環境: Automation Anywhere Enterprise 11.3.3.1 (Build 19100531)

ちょっと記事が長くなったので、次回に分けて今度はAutomation Anywhereの場合について解説します(^^♪

4
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?