こんにちは。AI&ロボティクスセンターの駒宮です。

 

今回は、UiPathの特徴的な機能のひとつ、データスクレイピング機能についてのお話です。

データスクレイピング機能とは、表やWebページなどからデータを抽出しDataTable型の変数に格納する機能です。ページが複数あっても「次へ」ボタン(※次のページへのリンク全般を、以降『「次へ」ボタン』と表現します)を押してページ遷移することで、目的の表データを全て取得することができます。

UiPathアカデミーで初めてデータスクレイピング機能を使った際は感動しました!!皆さんもそうではないでしょうか?しかし、その後、さまざまなWebアプリで試すうちに、失敗することが往々にしてありました…。「エラーにはならないけど何かおかしい」「抽出した件数が実行回毎に違う」「抽出した件数と実際の件数が合わない」などどいった問題です。

これらの原因は、構造化データを抽出(ExtraData)アクティビティ標準のページ遷移機能が弱い(状況によって失敗する)ことや、デフォルトの設定がContinueOnError=Trueで、エラーを無視する設定になっていることにあります。

今回は、安定して複数ページのデータスクレイピングをするためには、どのようなフローを構築すればいいかについてご紹介します。

失敗しないためにどうするか

データスクレイピング失敗の原因の多くは、ページ読込が完了する前に次の処理をしようとして起こっています。
  • 「次へ」ボタンが表示されるのが遅く、誤って最後のページと認識される
  • ページの遷移が遅く、誤って前のページの表データを取得してしまう
  • ページの読込が遅く、表が全て表示される前にデータを取得してしまう
また、以下のケースは標準のページ遷移オプションで対応できません。
  •  ページ番号しかないアプリで、「次へ」ボタンがそもそもない
  • 最後のページまでいっても「次へ」ボタンがある
これらの理由から、これまで私が担当した案件では、アクティビティ標準のページ遷移オプションを使ったことがありません。それではどうしたらよいか…。次のようなフローチャートを組んで、より安定したデータスクレイピングを行います。

データスクレイピングを安定させたサンプルフローチャート

 【処理概要】
1. ページ番号を初期化
2. 画面が表示されるまで待機
3. スクレイピング
4. 最後のページでない場合
 4.1. スクレイピングを続行
  4.1.1 ページ番号をカウントアップ
  4.1.2. 「次へ」をクリック
  4.1.3. 「2. 画面が表示されるまで待機」に遷移
5. 最後のページの場合
 5.1. 処理を終了
それぞれのシーケンスを詳しく見ていきます。

画面が表示されるまで待機

画面から情報を取得し、スクレイピングしようとしているページが正しく表示されたかを判断します。正しく表示されていない場合は、リトライ処理で少し時間を空けて、画面のローディングを待ってから再度確認します。

最後のページか?

画面情報から最後のページかどうかを判断します。
今回は表示された件数を”/”で分子と分母に分割し、両者を比べることで、最後のページかどうかを判断しています。
補足:文字列の分割(String.Split関数)
 指定された文字で区切られた部分文字列を格納する文字列配列を返します。
pageText = "1~50件/1719件中"
pageTextArray = pageText.Split("/"c)
// 区切り文字は文字列(string型)ではなく文字(char型)で指定する必要があるので、"/"cとします
numer = pageTextArray(0) // 1~50件
denom = pageTextArray(1) // 1719件中

スクレイピング

ページ番号が正しく、表も最後まで表示されたので、表データを抽出します。
構造化データを抽出(ExtraData)アクティビティは、デフォルトでContinueOnError=Trueですが、今回は抽出対象の表が存在することをここまでのフローで確認済みなので、空白(=False)にして、予期しない理由で抽出に失敗した場合はエラーを返すように設定します。
また、今回のように、構造化データを抽出(ExtraData)アクティビティを何回も呼び出す場合、出力(Output)のDataTable型変数にデータが追記されていきます。データテーブルを結合 (Join Data Tables)アクティビティなどを使う必要はありません。

スクレイピングを続行

最後のページではない場合、スクレイピングを続行し、「次へ」ボタンをクリックします。同時に次にスクレイピングするページ番号のカウントアップをします。

ログについて

このように、ページ遷移のフローを自前で用意することで、詳細なログ出すことも可能になります。標準のページ遷移オプションを使った場合は、このようにログを出すことはできないので、不具合があった際に原因の特定が困難です。

最後に

今回はデータスクレイピングを安定化させるためのノウハウを紹介しました。Webアプリケーションのデザインは様々ありますので、今回の方法が全てに当てはまるわけではないですが、「ページが表示されたか?」「何ページ目か?」「最後のページか?」といったような観点と、それを確認することのできる手段を考えてみてください。