見出し画像

PAD(Power Automate for Desktop)によるWebスクレイビングをやってみた ~第1回:MS一覧から個別MSページのテーブル取得~

ことの発端

いつも楽しくバトオペ2を遊んでおります。

この作品は、ほかの作品ではほぼモデル化されないようなマニアックな機体を含めて、非常にきれいなモデリングでモビルスーツを実装してくれます。なので、「この機体は非常に好きなのに実装されない」っという機体がほぼなく、多くのガノタを満足させてくれていると勝手に思っております。

そして、さらにうれしいことに、毎週新機体を追加してくれて、毎月末に機体性能を調整してくれる心優しい運営さんが運営してくれています。

つまり、毎週/毎月の頻度で機体が追加される/機体性能が変わるということになります。
運営からは特にMSの一覧は提供されていないのですが、有志の方が作成してくれているWikiにMSの一覧表があります。
いつも有難く確認させていただいておりますが、毎週/毎月の頻度で更新される情報を細かく反映していただいてる有志の方には頭が下がります。

ただし、WikiにあるMS一覧表は機体ごとになっております。
そして、機体ごとの個別のページのそれぞれの機体のLevelごとの性能が記載されています。

そのため、MS機体とLevelを含めて一覧となっている表が存在しておりません。(と思っています。)

そのため、今回は、すべてのMSの機体Levelごとの情報を一覧表として集めるべく、PAD(Power Automate for Desktop)を使用してみたいと思います。

やりたいこと

実現したいこと

とりあえず実現したいことは、

  1. WikiのMS一覧にアクセス

  2. 個別のMSページにアクセス

  3. 機体情報を取得

  4. Excel表に張り付け

という流れのことを行いたいと考えています。


やりたいことの詳細化

過去にこのような記事を書いていたこともあるので、少しだけやりたいことを分解したいと思います。

「①WikiのMS一覧にアクセス」

ここの部分は、個別のページにアクセスするための一覧を取得することが目的になります。
そのため、ここで実施することは、下記のような感じになります。

  1. MS一覧のページにアクセス

  2. ページ内のテーブルを指定(今回は強襲機のテーブルを使用)

  3. 指定したテーブルから機体名と個別ページへのURLを全機体分抽出

「②個別のMSページにアクセス」

ここの部分は、①で取得した個別ページのURLにアクセスすることなります。
なので、下記のようなことができるようにする必要があります。

  1. ①で取得した全機体分の個別ページの一つを取り出し

  2. 個別のページにアクセスする

ここで、ここまでの処理は、全機体分繰り返しすることになるので、繰り返し処理とすることを意識して以降の構成を分解していきます。

「③機体情報を取得」

ここの部分は、個別のページ内の機体情報のテーブルを取得します。
やることはこれだけで、内容としては難しくないのですが、うまく指定できないことがあり一番躓きました、、、
参照URLのセレクターの設定方法を参照して乗り切りました。

「④Excel表に張り付け」

ここの部分は取得したテーブルデータをExcelに張り付けることを行います。
ここで行うこととしては、

  1. Excelのデータが存在する最終行を取得

  2. 最終行に機体名を記載

  3. 次の行にテーブルデータを張り付け

を行います。

ここでのポイントは、最終行の取得方法になりますが、こちらはPADのExcelの操作の部分がいろいろできるのでそちらの機能を組み合わせて実施しました。


出来上がったPADのコード

PADのコードは下記のようになりました。
PADコピペすればそのまま動くかと思います。

FUNCTION getMsSpec GLOBAL
    WebAutomation.LaunchEdge.LaunchEdge Url: $'''https://w.atwiki.jp/battle-operation2/''' WindowState: WebAutomation.BrowserWindowState.Normal ClearCache: False ClearCookies: False WaitForPageToLoadTimeout: 60 Timeout: 60 BrowserInstance=> Browser
    Excel.LaunchExcel.LaunchUnderExistingProcess Visible: True Instance=> ExcelInstance
    WebAutomation.GoToWebPage.GoToWebPage BrowserInstance: Browser Url: $'''https://w.atwiki.jp/battle-operation2/pages/377.html''' WaitForPageToLoadTimeout: 60
    WebAutomation.ExtractData.ExtractTable BrowserInstance: Browser Control: $'''html > body > div:eq(0) > div > div:eq(1) > div:eq(2) > div:eq(0) > div:eq(7) > div > table > tbody > tr''' ExtractionParameters: {[$'''td:eq(2)''', $'''Own Text''', $'''''', $'''Value #1'''], [$'''td:eq(2) > a''', $'''Href''', $'''''', $'''Value #2'''] } PostProcessData: False TimeoutInSeconds: 60 ExtractedData=> DataFromWebPage
    LOOP FOREACH CurrentItem IN DataFromWebPage
        WebAutomation.GoToWebPage.GoToWebPage BrowserInstance: Browser Url: CurrentItem[1] WaitForPageToLoadTimeout: 60
        WebAutomation.ExtractData.ExtractHtmlTable BrowserInstance: Browser Control: $'''html > body > div:eq(0) > div > div:eq(1) > div:eq(2) > div:eq(0) > div:eq(9) > table''' ExtractionParameters: {[$'''汎用''', $'''LV1''', $'''LV2''', $'''LV3''', $'''LV4''', $'''LV5''', $'''LV6''', $'''LV7''', $'''LV8'''], [$'''''', $'''''', $'''''', $'''''', $'''''', $'''''', $'''''', $'''''', $''''''] } PostProcessData: False TimeoutInSeconds: 60 ExtractedData=> DataFromWebPage2
        Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeColumn=> FirstFreeColumn FirstFreeRow=> FirstFreeRow
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: $'''機体名''' Column: 1 Row: FirstFreeRow
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: CurrentItem[0] Column: 2 Row: FirstFreeRow
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: DataFromWebPage2 Column: 1 Row: FirstFreeRow + 1
    END
    Excel.SaveExcel.SaveAs Instance: ExcelInstance DocumentFormat: Excel.ExcelFormat.FromExtension DocumentPath: $'''<ここはPC上のディレクトリパスを指定>'''
    WebAutomation.CloseWebBrowser BrowserInstance: Browser
END FUNCTION

次への課題

次への課題

機体レベルでパラメータが共通の部分がWeb上ではテーブルのセルが結合して表示されていますが、取得したExcel表ではどこが共通かわからなくなっております。(開発競争に負けたヅダくんがわるいわけではないです、あくまで例として載せただけです)

手修正で治すこともできますが、今後のことを考えると、共通位置を含めたデータの取得方法が必要になると思っています。


まとめ

今回は、まずことのはじめとして、PADを用いてWeb一覧から個別のページへのURLを取得して、個別のページから情報を取得する方法を行っていました。

次回に向けての課題見えてきたので今回は、ここまでとしたいと思います。

少しでも皆様のお役に立てれば幸いです。


参考にしたURL様

基本的なことを確認したURL

今回一番苦労した特定のテーブルの取得に対しての記事



この記事が気に入ったらサポートをしてみませんか?