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

はじめに
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