【VBA】Webドライバー無しでスクレイピングする方法(HTTPリクエスト)
スクレイピングといえばSelenium(もしくはPython)と思っていませんか?
実は、Seleniumがマストというわけではなく、VBAから割と簡単にデータ取得する方法もあります。
特にSeleniumを使う場合、Webドライバーが必ず必要になります。
ブラウザのバージョンが変わる度に再インストールするのが面倒だったり
Webサイトのデータを取得するだけであれば、Webドライバーを使う必要もなく、割と簡単にデータを得ることができます。
※ただし、クリックなどの複雑な操作はできません。あくまでデータ取得のみ。(正確にはスクレイピングではないかも)
それでもデータ取得のみであれば、非常に便利なので活用してみてください。
Webドライバー無しでスクレイピングする方法(HTTPリクエスト)
Sub SendHTTPRequest()
''' サイトのhtmlテキストを取得
Dim xhr As Object
Dim url As String
Dim responseText As String
' URLを指定します
url = "https://yaromai.jp"
' XMLHTTPオブジェクトを作成します
Set xhr = CreateObject("MSXML2.XMLHTTP")
' GETリクエストを送信します
' (第3引数をFalseにするとサーバからのレスポンスを受け取るまで待つ)
xhr.Open "GET", url, False
xhr.send
' レスポンスを取得します
responseText = xhr.responseText
' レスポンスを出力します
Debug.Print responseText
End Sub
データ取得にはHTTPリクエストを行います。普段お使いのブラウザと同じことをVBAから行います。
↑のサンプルコードを実行すると、弊サイトのhtmlテキストを取得することができます。
XMLHTTPオブジェクトを作成して、Openメソッドとsendメソッドを実行するだけです。
あとは、responseTextプロパティを参照してレスポンスを確認するだけです。
h2タグのみのテキストを取得する方法
先ほどのコードだと生のhtmlのため、実際は欲しいデータだけ取得したいと思います。
そのため、タグ情報などを元に欲しいデータを探していきます。
Sub GetH2Content()
''' h2タグのテキストを取得
Dim xhr As Object
Dim url As String
Dim responseText As String
Dim htmlDoc As Object
Dim elms_h2 As Object
Dim elm_h2 As Object
Dim str_h2 As String
' URLを指定します
url = "https://yaromai.jp"
' XMLHTTPオブジェクトを作成します
Set xhr = CreateObject("MSXML2.XMLHTTP")
' GETリクエストを送信します
' (第3引数をFalseにするとサーバからのレスポンスを受け取るまで待つ)
xhr.Open "GET", url, False
xhr.send
' レスポンスを取得します
responseText = xhr.responseText
' テキストからHTMLドキュメントを作成
Set htmlDoc = CreateObject("HTMLFile")
htmlDoc.body.innerHTML = responseText
' h2要素を取得します
Set elms_h2 = htmlDoc.getElementsByTagName("h2")
' 各h2要素の内容を取得します
For Each elm_h2 In elms_h2
str_h2 = elm_h2.innerText
Debug.Print str_h2
Next
End Sub
このコードは、先ほどのコードの後に、h2タグの内容だけを得るようにコードを追加しています。
このコードを実行すると、弊サイトのhtmlテキストの内、h2タグの内容のみを取得することができます。
' テキストからHTMLドキュメントを作成
Set htmlDoc = CreateObject("HTMLFile")
htmlDoc.body.innerHTML = responseText
このコードでは、HTMLドキュメントのオブジェクトを生成して、その中(innerHTML)にHTTPリクエストで得たテキスト(responseText)を入れています。
これによってresponseTextの中身から、欲しい情報を抽出する操作ができます。
ここでは、getElementsByTagName(“h2")によって、h2タグの要素のみを抽出しています。
このように、HTTPリクエストとHTMLドキュメントを組み合わせることによって目的のデータのみを得ることができます。
自分でプログラムするのは難しいと思いましたら、ココナラにて作成請負もしていますので↓のリンクよりご連絡ください。