VBAでスクレイピングする時の方法について2022年2月現在、大きく分けて三パターンあるのでそれぞれやり方とかメリット・デメリットをざっくりとまとめてみました
どの方法が正解ってことはないのでケースバイケースで選んでもらえれば
HTTPリクエストで取得する
HTTPリクエストとは
ざっくりと言えば取得したい画面のソースを取得する
で、それをいい感じに分解してデータ取得してスクレイピングする
やり方
必要なライブラリ
- Microsoft HTML Object Library
- Microsoft XML, v6.0
サンプルソース
なぜdocumentをHTMLDocumentではなくObjectにしてるかと言うとそうしないとエラーが発生するから
回避方法あるなら誰か教えてください・・・
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ツールにも使われているようなので安心していいとこっそり布教しておく
https://docs.uipath.com/studio/lang-ja/docs/webdriver-configuration-steps
UiPath Documentation Portal - すべての貴重な情報のホーム。ここでは、複雑なインストール ガイドからクイック チュートリアル、実用的なビジネス例、自動化のベスト プラクティスに至るまで、UiPath エコシステムでの自動化の旅を案内するために必要なすべてを見つけることができます。
コメント