VBAでスクレイピングする3つの方法と簡単な使い方

VBAでスクレイピングする時の方法について2022年2月現在、大きく分けて三パターンあるのでそれぞれやり方とかメリット・デメリットをざっくりとまとめてみました

どの方法が正解ってことはないのでケースバイケースで選んでもらえれば

HTTPリクエストで取得する

HTTPリクエストとは

ざっくりと言えば取得したい画面のソースを取得する

で、それをいい感じに分解してデータ取得してスクレイピングする

やり方

必要なライブラリ

  • Microsoft HTML Object Library
  • Microsoft XML, v6.0

サンプルソース

なぜdocumentをHTMLDocumentではなくObjectにしてるかと言うとそうしないとエラーが発生するから

回避方法あるなら誰か教えてください・・・

VBAで実際に発生するエラー
Sub Sample()
Dim HttpReq As XMLHTTP60
'Dim document As HTMLDocument
Dim document As Object

Set HttpReq = New XMLHTTP60
With HttpReq
    .Open "GET", "https://example.com/"
    .send
    'HTTPリクエストの読み込み完了を待つ
    Do While .readyState < 4
        DoEvents
    Loop
    
    Set document = New HTMLDocument
    document.write .responseText
    Debug.Print document.getElementsByTagName("h1")(0).innerText
    Set document = Nothing
End With
Set HttpReq = Nothing
End Sub

メリット

  • 処理が速い(と言われているが通信は発生するので体感的には正直そこまで)
  • VBAの標準機能だけで利用できる

デメリット

  • 画面が見えないので実際の動作がどうなってるかわからない
  • デバッグしにくい
  • 動的ページ(ログイン処理とかボタンを押すなどの操作がある場合)には使えない

Internet Explorer(IE)で取得する

そのまんま、IEを操作しつつ情報を取得する

やり方

必要なライブラリ

  • Microsoft HTML Object Library
  • Microsoft Internet Controls

サンプルソース

Sub Sample()
Dim objIE As InternetExplorer
Dim document As HTMLDocument

Set objIE = New InternetExplorer
With objIE
    .Visible = True
    .navigate "https://example.com/"
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
    Set document = .document
    Debug.Print document.getElementsByTagName("h1")(0).innerText
    Set document = Nothing
    .Quit
End With
Set objIE = Nothing
End Sub

メリット

  • VBAの標準機能だけで利用できる
  • 実際に画面上でIEが動くのでわかりやすい ※非表示にもできる
  • デバッグしやすい
  • 動的ページにも対応できる

デメリット

  • IEなので動作が少し重い(遅い)
  • 2022年6月にIEのサポートが終了するので以降どうなるかわからない
  • 既にIEをサポート外としているWEBサービスがあるので利用できない可能性がある

Chromeで取得する

事前準備

結構マニアックな方法をしないとChromeは使えないしプログラムも書きにくいのでSeleniumを使う

使えるようにする方法は↓↓↓を参照

やり方

必要なライブラリ

  • Selenium Type Library

サンプルソース

Sub Sample()
Dim chrome As Selenium.ChromeDriver

Set chrome = New Selenium.ChromeDriver
With chrome
    .Get "https://example.com/"
    Debug.Print .FindElementByTag("h1").Text
    .Quit
End With
Set chrome = Nothing
End Sub

メリット

  • Chromeなので動作が快適(早い)
  • 実際に画面上でIEが動くのでわかりやすい
  • デバッグしやすい
  • 動的ページにも対応できる
  • IEに比べてコマンドが多く、歯痒いところに手が届く

デメリット

  • Selenium(正確にはSelenium Basic)をインストールする必要がある
  • Selenium はオープンソースなので開発がいつ中断するかわからない
  • WebDriver対策してあるサイトには使えない

あとがき

基本的に私はChrome一択

でも副業とかでプログラムを作ったりするときにSeleniumのインストールに抵抗を示す方もいるのでその場合は残ったどちらかを提案しながら検討してもらってます

ちなみにSeleniumは無料でかつ幅広く使われているのでむしろ積極的に使っていいと思うし、WebDriverはRPAツールにも使われているようなので安心していいとこっそり布教しておく

設定手順
Each web browser uses its own WebDriver protocol implementation. As such, when you plan your automation projects via the WebDriver protocol, you need require th...

コメント

タイトルとURLをコピーしました