前回、Power Automate DesktopでExcelの表を読み取り、入力されているURLからWEBページを開くことができました。せっかくExcelの表からWEBページを開いたのなら、そこから必要な情報だけ取得して表に書き戻せればいろいろ便利ですね。世間一般ではこれをWEBスクレイピングといいます。今回はPower Automate DesktopでWEBスクレイピングをやってみます。
前回の記事はこちら
準備
環境は前回のものを引き続き使用します。Excelの表に入力されたさいたま市の各区のWEBサイトを開いていくというものです。詳しくは前回をご覧ください。
フローの全体像は次のようになっています。
今回の目的は、Excelに開いた区のWEBページから「区からのお知らせ」(赤枠部分)を取得して書き込みます。
WEBスクレイピングを始める前の注意点として、WEBサイトの規約として明示的にそれを禁止している場合があります。私には全く触れる機会がないのでうろ覚えですが、TwitterだかFacebookだかがWEBスクレイピング禁止なはずです。実際にやる場合はよくWEBサイトを確認しましょう。
さいたま市のWEBサイトをざっと見ましたが、特にダメとは書いてなさそうなので問題ないと判断します。このネタが終わったら一生走らせることはないそんなに負荷にならなそうなフローなので許してくれるでしょう。
準備としてお知らせを記録するためのシートをURL表とは別に1枚作ります。次のようにしました。シート名は「お知らせ」です。
ここに各区のWEBサイトから取得したお知らせを区名と同時に書き込んでいきます。
Excelシートの切り替え
Power Automate DesktopではExcelのアクションはアクティブなシートに対して処理が行われます。よってシートを追加したことにより先のフローのままでは意図しないシートへ処理が実行される可能性が生じました。まずはこれに対処します。
フローのExcelの起動の次段にアクションペインから Excel → アクティブなExcelワークシートの設定 を追加します。パラメーターの設定は次のようになります。
Excelインスタンス:は直前に開いたExcelファイルである%ExcelInstance%になっているのを確認します。
次と共にワークシートをアクティブ化:というザ・機械翻訳な怪しい日本語の項目では、ワークシートを名前で選択するか、インデックスで選択するか選べます。簡単に名前にしておきます。
URLを記載しているシートの名前はWEBサイトなので、ワークシート名:にはそのように入力しました。
これで、以降はワークシートといえばこのワークシートをさすことになります。
カウンタ変数の作成
次に書き込む行を移動させるためのカウンタ変数を作成します。場所はループ前ならどこでもいいのですが、ブラウザを起動した次のステップに追加するとします。
アクションの 変数 → 変数の設定 を追加します。
パラメーターの設定は次のようになります。
設定:は変数名です。わかりやすいように%Row%としておきます。
宛先:はこれまた翻訳がおかしいですが、初期値のことです。お知らせシートは先頭行がタイトルなので、データは2行目から書き込みます。よって2とします。
ここまでのフローはこのようになりました。
さて、ステップ3と4でURL一覧表から各区のURLは変数へ格納しているので、もうWEBサイトシートはお役御免です。ここから先はお知らせシートに書き込むのでアクティブなシートを切り替えておきます。
Excel → アクティブなExcelワークシートの設定 でさっきと同じ要領でお知らせシートをアクティブ化します。
これでお知らせシートにデータを書き込む準備ができました。ここからが今回の本題です。
WEBページのデータを取得
For Eachループの中の新しいタブを作成の次へ Webオートメーション → Webデータ抽出 → Webページからデータを抽出する を追加します。
パラメーターの設定は次のようになります。
Webブラウザーインスタンス:は前段で開いた新規タブをしめす変数を指定します。初期値は%NewBrowser%という名前になっていましたのでそれです。
次にWEBページのどのデータを抽出するかを指定するのですが、これがかなり独特な方法で、はっきりいってわかりずらいです。
そのうちアップデートで変更されると思いますが、現時点での方法はパラメーター設定画面の注釈に書いてあるとおりで、この画面のままWebブラウザを起動するか、ブラウザをフォアグラウンドへ持って行きます。
すると次のようなライブWebヘルパーというウィンドウが開きます。
この状態でブラウザ上をポイントしていくと赤枠がでます。
目的のデータに赤枠が出たところで右クリックでメニューを出します。
要素の値を抽出 → テキスト を選択します。
ライブWebヘルパーに文字が取得されました。終了ボタンで閉じます。
パラメーターの設定画面に戻ってきますが、こちらは何も変化がありません。
しかしこれでパラメーターは正しく設定されています。なんとこの画面で取得した要素を再確認することはできません。ビックリするくらい不親切です。
ではどこにあるかというと、一度パラメーター設定を閉じて、メイン画面右ペインのUI要素(ひし形が重なったアイコン)をクリックすると見ることができます。
UI要素のRecordingの配下にdivというのがあります。開いてみると次のようになっています。
値そのものではなく、WEBページの要素までの参照を記録しています。これはデータの場所をしめしているだけで、データ自体はWEBサイト側が更新されれば、その値をとれるということです。
取得した内容は%DataFromWebPage%という変数に格納されます。
これをExcelシートへ書き込んでいきましょう。
取得したWEBページデータの書き込み
Webページのデータ取得ステップの次へ Excel → Excelワークシートに書き込み を追加します。
パラメーターの設定は次のようになります。
Excelインスタンス:はすでに開いている%ExcelInstance%になっています。
書き込む値:はループでURL一覧から取り出したデータ%CurrentItem%のうち区名が必要なので%CurrentItem[‘区名’]%とします。
書き込みモード:は指定したセル上とします。
列:は先のお知らせシートの構成にしたがい、1とします。
行:は変数の設定で用意した行カウンタ変数である%Row%を指定します。
ここまでで、URL一覧から各行の値を順次取り出し、その区名をお知らせシートに書き込むという処理になりました。
同じ要領でWebページから取得した値を書き込みます。つづけて Excel → Excelワークシートに書き込み を追加します。
パラメーターは次のように設定します。
書き込む値:を%DataFromWebPage%に
列:を2にします。
最後に、このままだと%Row%が永遠に2のままなので、2行目にすべて書き込まれてしまうので%Row%を増やします。
ループ内の最後に 変数 → 変数を大きくする を追加します。
パラメーター設定は説明するまでもない感じですが、こうです。
これでループのたびに%Row%が1ずつ増えていくので、お知らせシートの書き込み行も1行ずつずれていくことになります。
カウンタ変数を増やし忘れて無限ループでExcelが落ちて、しかも直前にファイル保存してなくて最初からやりなおし、はVBAerあるあるですよね。
完成したフローは次のようになりました。
実行すると
お知らせシートに各区のからのお知らせが区名とともに書き込まれました。
まとめ
私の環境だけかもしれませんが
・Edgeがちょくちょく制御できなくなる問題
・フローで起動したExcelはフローから閉じないとプロセスに居続ける問題
が発生しました。Edgeは何の迷いもなく別ブラウザに乗り換えることができるので即解決ですが、Excelインスタンスがどんどんできちゃうのは実用上は問題なくても気持ち悪いですね。地味にメモリも喰ってますし。
フローの最後でExcelを閉じればいいのですが、そうするとそのExcelを見たかったらいちいちファイルをダブルクリックで開かないといけません。RPAによる利便性が激減です。
WEBデータの取得のわかりにくさも含めアップデートで改善されることを期待します。
WEBスクレイピングは当然ながらVBAでもPythonでもできるのですが、GUIでポチポチしていくだけでできてしまうPower Automate Desktopによりしきいがグッとさがりました。業務で定期的にWEBから情報を取得する必要があるなら挑戦してみてください。
つづく。