Help us understand the problem. What is going on with this article?

UiPathサンプル - Webの価格比較サイトから欲しい製品の価格情報の取得を自動化する

More than 1 year has passed since last update.

※公開情報のみを参照して書いているため、筆者の推論を一部含んでいます。

シナリオ

HP製のノートPCが欲しいとして、kakaku.comからその価格をCSVファイルに保存するプロセスを紹介します。

Webページから欲しい情報だけを抽出してCSVファイルに保存するコードをプログラミング言語を使って実装していくのは骨の折れる作業ですが、UiPathを使ったRPAだとわずか数分で作成できてしまいます。

このサンプルで使用する機能

  • UiPath Studio
    • Data Scraping - Webページのデータを取得するためのパターン認識をします

  • UiPathアクティビティ
    • OpenBrowser - ブラウザを起動し、指定したURLを開きます
    • Write Csv File - 取得したデータをCSVファイルで保存します

  • Windows Workflow
    • Assignコントロール

  • .Net関連
    • System.data.DataTable - Selectメソッド、CopyToDataTableメソッドを使います。

準備

  1. サンプルzipファイルをダウンロードします。(筆者が作成したワークフローです)
    https://drive.google.com/open?id=0ByoHD8pH6Am7SHZWR284V0l4TkE

    zipファイルには以下のファイルが含まれています。これらのファイルを任意の場所に展開します。

    - .screenshots - Data Scrapingした際に自動で保存されるスクリーンショット画像ファイルです
    - Main.xaml - ワークフローのXAML実装
    - PriceList.csv - 出力されるCSVファイル
    - project.json - UiPathプロジェクトファイル
    


  2. UiPathを起動します。Main.xamlを選択し、UiPathで開きます。



  3. Flowchartが表示されます。


  4. SETUP画面からChrome extensionをインストールします。

実行と結果

  1. Runボタン(またはF5キー)で実行します。


  2. ブラウザが起動し、自動的に価格リストを読み取っていきます。



  3. HP製ノートPCの価格リストを含んだPriceList.csvが出力されます。


    ※11行目がブランクなのは、価格が以下のように非表示であったためです。

    ビデオで見るとこのような動作イメージになります。
    Video

ワークフロー作成ビデオ

1から自分でworkflowを作るとこのようになります。
Video

解説

  1. "Open browser"アクティビティ

    • UiPath.Core.Activities.OpenBrowserを使いブラウザを起動します。

    プロパティを見てみましょう。

    ①ContinueOnError
    OpenBrowserアクティビティ処理中にエラーが発生した場合にすぐに処理を止めるか、エラーを無視して先にすすめるかのオプションです。デフォルトはfalseです。
    trueとした場合、例えばURLがリンク切れになっていたとしてもエラーメッセージを出さずに次のステップに進みます。

    ②BrowserType
    IE, Firefox, Chromeの中から起動するブラウザを指定します。

    ③Url
    ブラウザで開くURLを指定します。

    ④Private
    Private指定の場合はLogを出しません。

    ⑤Hidden
    ブラウザをアプリケーションから起動するときHiddenモード(ウィンドウの非表示モード)にするかどうかを指定します。

    ただし、Windowsではこのオプションの有効・無効はアプリケーション側の仕様に委ねられており、Hiddenとしてもウィンドウが非表示にならない場合が多いです。実際、IE, Firefox, Chromeでは有効にならないと思った方がよいです。

    Hiddenオプションが効かない実例
    HiddenモードでChromeを起動させるC#コードは以下のようになります。
    しかし、ChromeはHiddenモードで起動しません。(他の"Maximized"や"Minimized"オプションは指定通りに動きます)

    参照「MSDN ProcessWindowStyle 列挙型

    ⑥NewSession
    新しいブラウザのセッションを開始するかを指定します。
    ただし、Chromeはじめ多くのブラウザで同時に複数のセッションを張ることは許していません。Chromeを例に取れば、同時に複数セッションを作成したい場合はChromeユーザアカウント(Googleアカウントのことではありません)を複数作り、それらを使い分ける必要があります。(例えば、複数のGmailアカウントのメールを同じPCで同時にチェックするような場合はこうします)

    ⑦Private
    ブラウザをPrivateモードで起動するかを指定します。
    Privateモードの場合、閲覧履歴はブラウザに残りません。

    ⑧UiBrowser
    起動したブラウザに対して何か操作したい場合に変数を指定します。

    UiBrowserの使用例
    例えば、起動したブラウザを最後に閉じたい場合には以下のようにInvoke Methodアクティビティを使い実現できます。

    まず、UiBrowser変数を指定します。


    OpenBrowserアクティビティのプロパティに変数をセットします。


    Invoke Methodを追加し、Closeメソッドを呼びます。


    参照: "Browser"セクション" - https://www.uipath.com/activities-guide

  2. "Data scraping"アクティビティ

    • UiPath Studioで"Data scraping"を行うと、以下のようにWebサイトの情報を読み取るアクティビティが自動で生成されます。


      ダブルクリックすると以下のようになっています。

    ①"Attach Browser"
    読み取り対象とするWebページをUiPath.Core.Activities.BrowserScopeアクティビティで特定します。プロパティを見ると、Selectorは以下のようになっています。

    今回は単純にapp属性としてChromeブラウザの実行ファイル名が、title属性にWebページのタイトルのみが指定されています。

    ②"Extract Structured Data 'DIV main'"
    UiPath.Core.Activities.ExtractDataで欲しいWebページ情報を抽出し、String変数"ExtractDataTable"に代入します。

    (i) ContinueOnError
    "true"とすると実行中にエラーが発生した場合でも途中で止めず、次のステップに進みます。

    (ii) ExtractMetadata
    欲しいHTMLデータを見つけ出すための探索条件をXML形式で指定します。

    欲しいHTMLデータを見つけ出す
    (ここでの内容はUiPathを使うために必ずしも理解する必要があるわけではありません。また、公式ドキュメントを参照しているわけではなく、筆者の推論を基にしています。)

    プロパティからXML Editorを開くと以下のようになっています。


    一方、Webページのソースは以下のようになっています。



    XML Editorに戻ると、row要素のwebctrlではtagが"div"で且つclassが"rkgContents"であるHTMLの部分をまず指定しています。次に、その子要素のうちtagが"div"で且つclassが"rkgBox noGraph withReview"である部分を1つのrowの単位として認識させる内容となっています。

    Webページのソースを見ると、1つのノートPC情報を構成する最上位要素が実際にこのclass("rkgBox noGraph")になっており、この単位でノートPCの情報がリストとして繰り返されていることがわかります。

    また、"ProductName"や"Price"についても、次の(iii)でセレクタとして指定したHTMLの最上位要素から段階的に子要素、孫要素、ひ孫要素・・・とたどっていき最終的に目的のプロダクト情報もしくは価格情報に辿りつくための情報が与えられているのがわかります。

    (iii) Selector
    探索するGUI要素(もしくはその親要素)の属性です。

    Webページのソースを見ると、今回読み取り対象となるHTMLの最上位要素がIDに"main"をもつDIV要素であることがわかります。

    (iv) DelayBetweenPagesMS
    "次のページ"がロードされるまで待機する時間(ミリ秒単位)です。

    (v) MaxNumberOfResults
    抽出する最大件数を指定します。0を指定すると全件になります。デフォルトは100です。

    (vi) NextLinkSelector
    "次のページ"へとナビゲートするリンクやボタンを特定するためのセレクタです。
    プロパティではアンカー要素"a"の値である「次へ」とa要素の親要素であるdiv要素のIDである"main"が指定されています。


    こちらが実際のWebページの内容です。


    parent要素のIDは"main"となっています。


    (vii) DataTable
    HTMLデータを格納するDataTable型の変数を指定します。


    3. Assignアクティビティ
    抽出したHTMLデータから、名前に"HP"が含まれているものだけを取り出します。

    ExtractDataTable = ExtractDataTable.Select("ProductName LIKE '*HP*'").CopyToDataTable()
    

    "Select"はSystem.data.DataTableのメソッドで、ワイルドカード"*"とLIKE演算子を使うことで「キーワード"HP"が含まれる"ProductName"をもつデータのみ」を戻り値として返します。

    注意が必要なのは、Selectメソッドの戻り値はDataRow型の配列として戻されるので(次のCSVファイルへの出力プロセスで必要な)DataTable型に変換するためにCopyToDataTableメソッドを使用しています。

  3. "Write CSV"アクティビティ
    最後に、データをCSVファイルとして出力します。
    FilePathとして出力先ファイル"PriceList.csv"を、そしてデータが格納されたDataTable型変数の"ExtractDataTable"を指定します。

Cafe
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした