Power Automate for Desktop でリファレンス更新チェック(Web スクレイピング)

はじめに

この記事は、RPA(ロボティック・プロセス・オートメーション) Advent Calendar 2023 12月21日担当分の記事です。

ブログでPower Fx の数式リファレンスをカテゴリ別に分けて記載した記事を作成しています。
また、定期的(1,2か月に一回くらい)更新チェックをして反映もしています。

その際に作ったんですが、Power Automate for Desktop(以降デスクトップフローで)を使って
Webの公式リファレンスから最新情報を取得してきています。Webスクレイピングってやつですかね。
大変重宝していてこれなかったら二度と更新出来ないかもしれませんw

今回は作成したデスクトップフロー「Power Fx リファレンス更新チェック フロー」をご紹介します。
Power Apps Power Fxリファレンスページから取ってくるやつですが、調整すれば他にも応用できるかなと思います。

NOTEWebスクレイピングはサイトによって禁止されている場合があるので
事前に問題ないサイトかをご確認いただいた上でご使用ください。

やりたいこと

以下のPower Fxの公式リファレンスのページがあり、ここに大体200個くらいの関数・数式が載っています。
これがアルファベット順でしか用意されておらず、用途に応じたものを一緒に把握したり調べたりがやりずらい
と前から感じておりました。なので自分でカテゴリ分けしたものを作ってしまおうというのがキッカケです。

TIPS※日本語、英語ページがそれぞれあり(間のen-usとja-jpが違う)
英語ページの方が更新が早いのでそちらを主体として取ってきています。

Power Fx 数式リファレンス – Power Platform |Microsoft Learn

公式のPower Fx リファレンスページ サイドリンクに関数・数式のリストとリンクがある

最終更新日は各ページの上部に記載あり 一覧化はされていないのでここを一つ一つ見に行かないとわからない

この中から関数・数式をリスト化してそれぞれのリンクURLと最終更新日を取得したいです。
そこからのカテゴリ分けなどは自分でやるので上記の一覧が取れればOK!

サイドリンクに各関数・数式の詳細ページのリンクがズラーっとあります。
 →これを取って関数・数式の一覧にしたい!
 →併せてリンクURLも取りたい!

ページの最終更新日は各詳細ページの上部に載っています。
どれに更新があったかは各詳細ページを見に行かないとわからないので大変手間です(というか見ない)
 →この最終更新日を取ってきたリストに追加して一覧化したい!

ということで作成したデスクトップフローが以下です。

PowerFxリファレンス更新チェック フロー

基本的な作成の流れなどは割愛してます。まずは実装内容ですね。

上記が全体です。
全体の概要はこんな感じです。

  1. シート名用に今日の日付を保持
  2. ブラウザ(Edge)を起動してリファレンスページ開く
  3. Webページからデータ抽出でサイドリンク部分を取得
  4. 事前に用意していたエクセルを起動して今日のシートを追加
  5. 取得したデータ(タイトル、URL)を書き込む ※この段階でテキストとURLは取れてる
  6. 最終更新日を取るため各ページのURLを使って遷移する
  7. 詳細ページ上からデータ抽出で更新日部分を取得
  8. ⑤ の一覧に追記していく
  9.  ⑥ー⑧を件数分ループ

ループしてのページアクセスが200回位あるので完了までは10分程度かかる感じで遅めです。
個人用ですし別に問題ないので気にしておりません。

NOTE最初はさらに前回取得したシートから差分を抽出して、新規や更新を判断する列を追加する処理を入れてたり、完了時メール通知とか入れてたんですが、いまいち安定してなかったのと、さらに完了が遅くなるので廃止して上記のようにシンプルにしました。

以降でポイントの部分について解説します。

Webからデータを抽出(サイドリンク部分)

以下の部分についてです。ブラウザを開いて、サイドリンク部分のデータ抽出がメインです。

Egdeを起動

ここは普通にURLを指定しているくらいですね。ウィンドウは最小化してます。
その他の設定も少しは調整したかもしれないですが、ちょっと忘れました💦
※開いた際にポップアップが出るなどあるとその辺の調整が必要かもしれません。

ブラウザー自動化アクション リファレンス – Power Automate | Microsoft Learn

 ページからデータを抽出する(ライブWebヘルパーを使う!)

ここがポイントですね。データを抽出するのにこのアクションを使うと画面のどの部分を取ってくるのか
ライブWebヘルパーが開き場所や要素を選択して取ってこれます。
こちらの使い方の詳細は別途記事がいっぱい出ているかと思いますのでそちらご参考ください(自分も参考に実装しました)
今回の内容について以下順にご説明します。

ブラウザー自動化アクション リファレンス – Power Automate | Microsoft Learn

上記アクションを追加してから、ブラウザを開くとライブWebヘルパーが発動する
→リファレンスページを開いて、取りたいサイドリンク部分にあてる。今回はこのOverView以降の200個くらいあるリストを取りたい。

右クリックしてメニューから「要素の値を抽出」>テキストを選択
→これでタイトルが取れる

同じOverViewを選択したまま右クリックして「要素の値を抽出」>今度はHrefを選択(URL)

取得するデータの結果画面ではこの時点ではこうなっている

続いて、次の要素である「Power Apps formula reference」を選択して右クリック、
「要素の値を抽出」>テキストを指定する。

★そうすると一気に他の項目のテキスト、Hrefを対象にしてくれます!
これは素晴らしい機能ですね!あー、テキストとURLを選択して次の要素も欲しいのねー、
てことはこの辺までおんなじ感じで欲しいんでしょ、ほらやったげたよ!という感じです。

そして終了してアクションに戻ると以下のようになっています。これで保存ですね。
抽出されるデータの概要:レコードを2 -列テーブルの形式で抽出します

TIPSライブWebヘルパーは別画面開くとすぐに動き出すのでちょっと扱いがなれなかったですが、
大変便利なので、何度かやってみるとうまくいくと思います。

いちどここまでで編集画面で実行してみます。変数を確認して以下のようにテーブルですべて取れていれば完璧です。

エクセルへ書き出し

以下の部分についてです。あらかじめ用意していたエクセル(同じファイルにシート追加していって更新する)を指定してワークシートを追加。その際に最初に今日日付でフォーマットした文字列をシート名に指定してます。
配置はドキュメントフォルダー配下なので特別なフォルダーというアクションでやってます。

そしてシートをアクティブにして取得した変数データ(テーブル形式)を書き込みしています。

特別なフォルダーを使って場所指定してエクセルを開く

特別なフォルダーを取得アクションを使うと、ドキュメントやデスクトップなどの場所を指定できます。
共有する際もその人の場所となるので使いやすいです。

Excelの起動でパスに先ほどの特別なフォルダーを使って、その下に用意していたエクセルを指定します。
インスタンスは表示する設定にしています。

ワークシートを追加、取得したデータ(テキスト、URL)を書き込む

今日日付でフォーマットしたシート名を付けてワークシートを追加します。そしてアクティブ化します。

そして取得したデータ(テキスト、URLのテーブルデータ)を書き込みます。
テーブル形式なので最初のセル(現在のアクティブなセル)指定で一気に書き込みできます。

★ここまでで動かすと以下のようになります。タイトル、URLの一覧を取りたいまでだったらここまでで完了ですね!

各ページの最終更新日を取得して一覧に追加

最後の部分です。ここではループして各リンク先(詳細ページ)へ遷移して、
そのページ上の更新日付部分をWebページからデータを抽出で取ってきて、
エクセルの一覧の3列目に追加していく。という処理です。

ループ処理

ループアクションを追加して以下のように指定します。
開始は0、終了は取得したデータ件数‐1です。インデックスは0から開始されるのでその調整ですね。
以降のアクションをループ内に追加していきます。

詳細ページに遷移する

Webページに移動アクションでURLをループインデックスを使って取得データから取ってきます。
以下のように書くと取得データの今のループ数の行(最初は0で次は1・・・)の2番目の列を指定(URL部分)となります。

以下のデータから取ってきていますね。インデックスは0からなので注意

 ページからデータを抽出するその2(ライブWebヘルパーを使う!)

ここも同様にライブWebヘルパーを使って更新日部分を取得します。

ライブWebヘルパーで更新日の部分を選択して右クリック>要素の値を抽出>テキストを指定

以下のように取れればOKです。終了して保存します。

ワークシートへ更新日を追記

以下のように取得した値をループインデックスを使って行を特定し、指定の列(3列目)に追加します。

最後にブラウザを閉じて完了

最終出力結果

これで実装完了です。動かしてみて以下のようにエクセルファイルにタイトル、URL、最終更新日の情報が出力されればOKです。
200回位ループしてページ遷移するので10分くらいはかかると思います。(タイトル、URLまでの取得だとすぐ終わります)

このフローで出力する最終的な内容

おわりに

ということで今回は初のデスクトップフローの記事です。
RPA(ロボティック・プロセス・オートメーション) Advent Calendar 2023 に登録させてもらったので、
それならばと書いてみました。
もっとさらっとにしようと思ったんですが、シンプルなものでも意外に長くなってしまいますね💦

このフローのおかげで定期的に一覧を取ってこれて、更新が入っているかも分かり、そこだけチェックすればOK!
なので大満足なフローとなっています。

今回のフローは個人用なので、エラーがあったりしたらの対応とか、より効率化を求めて、、
という感じではなく、動いてくれればOKというものです。
基本デスクトップフローは個人が効率化のために作るものなので、深く考えずにラフにサクッと作って使う!
というスタンスがいいよなーと思います。それでは!

フローテキストデータ

最後にこのデスクトップフローの処理を貼っつけました。
ファイル名などは必要に応じて調整して事前に用意してください。
Mainにコピーすれば動くと思います(たぶん) 

Power Fxリファレンス更新チェックフロー テキストデータ

CodeDateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
Text.ConvertDateTimeToText.FromCustomDateTime DateTime: CurrentDateTime CustomFormat: $”’yyyyMMdd”’ Result=> FormattedDateTime
**REGION ブラウザデータ取得
WebAutomation.LaunchEdge.LaunchEdgeCloseDialog Url: $”’https://learn.microsoft.com/en-us/power-platform/power-fx/formula-reference”’ WindowState: WebAutomation.BrowserWindowState.Minimized ClearCache: False ClearCookies: False WaitForPageToLoadTimeout: 60 Timeout: 60 BrowserInstance=> Browser
WebAutomation.ExtractData.ExtractTable BrowserInstance: Browser Control: $”’html > body > div:eq(1) > div > div > nav > ul > li > ul > li:eq(11) > ul > li”’ ExtractionParameters: {[$”’a”’, $”’Own Text”’, $”””, $”’Value #1”’], [$”’a”’, $”’Href”’, $”””, $”’Value #2”’] } PostProcessData: False TimeoutInSeconds: 60 ExtractedData=> DataFromWebPage
**ENDREGION
**REGION 最新データ_タイトル、URLを書き込み
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.Personal SpecialFolderPath=> SpecialFolderPath
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: $”’%SpecialFolderPath%\\PowerAppsリファレンス更新チェック.xlsx”’ Visible: True ReadOnly: False Instance=> ExcelInstance
Excel.AddWorksheet Instance: ExcelInstance Name: FormattedDateTime WorksheetPosition: Excel.WorksheetPosition.First
Excel.SetActiveWorksheet.ActivateWorksheetByName Instance: ExcelInstance Name: FormattedDateTime
Excel.WriteToExcel.Write Instance: ExcelInstance Value: DataFromWebPage
**ENDREGION
**REGION 最新データ_更新日を書き込み
LOOP LoopIndex FROM 0 TO DataFromWebPage.RowsCount – 1 STEP 1
WebAutomation.GoToWebPage.GoToWebPage BrowserInstance: Browser Url: DataFromWebPage[LoopIndex][1] WaitForPageToLoadTimeout: 60
WebAutomation.ExtractData.ExtractSingleValue BrowserInstance: Browser ExtractionParameters: {[$”’html > body > div:eq(1) > div > section > div > div:eq(0) > main > div:eq(2) > div:eq(0) > div:eq(0) > ul > li:eq(1) > time”’, $”’Own Text”’, $”””] } TimeoutInSeconds: 60 ExtractedData=> Article
Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: Article Column: 3 Row: LoopIndex + 1
END
WebAutomation.CloseWebBrowser BrowserInstance: Browser
**ENDREGION

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

ヨウセイ

ヨウセイ

一般職からSharePoint、C#、.NET系技術者へ、そこからPower App、Power Automate技術者へと転身。 ワンランク上のおっさんはPower Appsでシステム開発が出来る〜! qiitaや自社HPでも技術ブログを書いていました。

関連記事

コメント

この記事へのコメントはありません。

CONTENTS