このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【VBA】Webドライバー無しでスクレイピングする方法(HTTPリクエスト)

スクレイピングといえばSelenium(もしくはPython)と思っていませんか?

実は、Seleniumがマストというわけではなく、VBAから割と簡単にデータ取得する方法もあります。

特にSeleniumを使う場合、Webドライバーが必ず必要になります。
ブラウザのバージョンが変わる度に再インストールするのが面倒だったり

Webサイトのデータを取得するだけであれば、Webドライバーを使う必要もなく、割と簡単にデータを得ることができます。

※ただし、クリックなどの複雑な操作はできません。あくまでデータ取得のみ。(正確にはスクレイピングではないかも)

それでもデータ取得のみであれば、非常に便利なので活用してみてください。

VBAが難しいと感じたら
ココナラにてVBAの作成依頼を受け付けています。
ご依頼・ご相談はこちらから

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
responseTextの内容(生のhtmlが出力される)

データ取得には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ドキュメントを組み合わせることによって目的のデータのみを得ることができます。

自分でプログラムするのは難しいと思いましたら、ココナラにて作成請負もしていますので↓のリンクよりご連絡ください。

《VBA上級者になりたい人へ》
VBA上級者を目指したい人にはパーフェクトExcel VBA一択です。
この本を読み切れば間違いなくVBA上級者になれます。

VBAが難しいと感じたら
ココナラにてVBAの作成依頼を受け付けています。
ご依頼・ご相談はこちらから

VBA

Posted by やろまい