Closed1

(没ネタ) SeleniumなしでWebDriverを操作するには - Part3

Kento.YamadaKento.Yamada

はじめに

前回

Web スクレイピングをするにあたっての基本

ここまで
WebDriver をウィンドウのコントロールやエレメントの操作まで解説してきましたが

Web スクレイピングの基本としては以下のような動作があります。

  • 取得
    • 要素の状態を取得
    • ページソースを取得
  • 入力
    • UI クリック
    • テキストを入力
  • 出力
    • ファイル出力
  • ウィンドウ操作
    • ウィンドウハンドルを取得
    • ウィンドウタイトルを取得
  • パース
    • HTML
    • XML
    • JSON
  • スクリプトの実行
    • JavaScript の同期実行
    • JavaScript の非同期実行

ここまでの内容と Web リクエストメソッドに関する知識だけでモダンブラウザを活用した Web スクレイピングが実現できます。

開発環境

二つの環境で動作確認をやりました。

環境 A

  • Surface Book(初代)

    • Intel(R) Core(TM) i5-6300U CPU @ 2.40GHz 2.50 GHz
    • 実装 RAM 8GB
  • エディション Windows 10 Pro

  • バージョン 20H2

  • OS ビルド 19042.867

  • Microsoft Edge

    • 95.0.1020.53 - 64bit

環境 B

  • TOSHIBA Dynabook

    • Intel Core i5-6200U CPU 2.30GHz
    • 実装 RAM 4GB
  • エディション Windows 10 Enterprise

  • バージョン 1909

  • OS ビルド 18363.1734

  • Microsoft Edge

    • Version 94.0.992.38

WebDriver のセットアップ

Microsoft Edge を操作する為には
現在インストールされている Microsoft Edge 用の WebDriver(以下、EdgeDriver)が必要となる為ダウンロードする。

今回はワンクリックで更新できるツールを作成しましたのでこれを利用します。(完全オリジナル)
DownloadWebDriver

上記のツールをdotnet buildビルドして実行することにより
Web ブラウザからダウンロードをクリックすることなくインストールすることができます。

Excel VBA で機能を実装していく

どうやら Qiita だと VBA で実装した例がバズっているようなので
真似して書くことにした。

該当記事の SendRequest メソッドを引用して今回は実践してみる。

該当記事

SendRequest メソッドの説明

引数はメソッドタイプ、エンドポイント、ディクショナリーの三つを渡す。
なお、第 3 引数は省略可とする。
物によっては null を返す場合がある為、その時は文字列で null を返す。

また、今回はテキストデータを変換するモジュールとして JSON Converter を利用する。
JsonConverter
※とても便利なモジュールありがとうございます。

'
' WebDriverに対してリクエストを送る際に利用
'
Public Function SendRequest(method As String, url As String, Optional Data As Dictionary = Nothing) As Dictionary
  Dim Json As Object
  ' クライアントの起動
  Dim client As Object
  Set client = CreateObject("MSXML2.ServerXMLHTTP")

  ' メソッドに応じてリクエスト送信
  client.Open method, url
  If method = "POST" Or method = "PUT" Then
    client.setRequestHeader "Content-Type", "application/json"
    client.send JsonConverter.ConvertToJson(Data)
  Else
    client.send
  End If

  ' 送信完了待ち
  Do While client.readyState < 4
    DoEvents
  Loop
  ' レスポンスをDictionaryに変換してリターン
  Debug.Print client.responseText
  Set Json = JsonConverter.ParseJson(client.responseText)
  If IsNull(Json("value")) Then
    Set Data = New Dictionary
    Data.Add "value", "null"
    Set SendRequest = Data
  Else
    Set SendRequest = Json
  End If
End Function

いくつか実際に作ってみる

Microsoft Edgeを操作

このスクラップは2024/02/14にクローズされました