適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

WinHTTPとVBAでスクレイピングをしてみる

この記事では

  • VBAを使ったスクレイピングの一つの手法であるWinHTTPを使ったスクレイピングの例を紹介しています。
  • VBAによるWinHTTPを使ったスクレイピングについて知りたい人に向けて書いています。
  • シリーズものになります。その1はこちら→VBAでウェブスクレイピング_WinHTTP編その1 - 適材適所

VBAでWinHTTPを使う

IEによるスクレイピングとWinHTTPによるスクレイピングの違いについて前回 述べました。

今回は実際にWinHTTPを使ってスクレイピングしてみたいと思います。

難しい理屈は抜きにして、とりあえず動くものを作って、実際のWinHTTPの例を見てみることにしましょう。

VBAでWinHTTPを使う準備をする

VBEの参照設定から、Microsoft Win HTTP Services ○○を探します。

f:id:shinmai_papa:20190828082126p:plain

こうすることで、コーディングの際にインテリセンスが働くので楽をすることができます。

試しにWinHTTPでスクレイピングしてみる

細かいことは抜きにして、まずは動くものを見てみましょう。 スクレイピング先は「 https://www.yahoo.co.jp/」yahoo様にしましょう。

Sub WinHTTP_sample()
   'オブジェクト変数の宣言
   Dim request As WinHttp.WinHttpRequest: Set request = New WinHttp.WinHttpRequest
   'メソッド、URLの設定
   request.Open "GET", "https://www.yahoo.co.jp/"
   'サーバーへ送信
   request.send
   '返ってきたHTMLをイミディエイトウィンドウに出力
   Debug.Print request.responseText
End Sub

実行すると・・・ f:id:shinmai_papa:20190828082131p:plain イミディエイトウィンドウが意味不明な文字列で溢れかえってしまいました。(黒地に緑字ですが、イミディエイトウィンドウです!デフォルトのだと目が疲れるので・・・。)

ちゃんとスクレイピングできているようです。

これがYahooのHTMLになります。

実行してみると、あっという間にHTMLを取得できたのがお判りになったかと思います。

HTMLの中の情報を集めたいだけであれば、この文字列の中から必要な情報を抽出するだけで簡単なツールができます。

コードの解説

  Dim request As WinHttp.WinHttpRequest: Set request = New WinHttp.WinHttpRequest

WinHttp.WinHttpRequest型の変数を用意します。WinHttp.WinHttpRequestは、WinHttpを省略して書くこともできます。

request.Open "GET", "https://www.yahoo.co.jp/"

WinHttpRequestのOpenメソッドの呼び出しは、HTTP動詞とURLを指定します。第三引数はここでは考慮しません。

HTTP動詞とは、GETやPOSTなどがありますが、細かいことは抜きにして、ここではGETを指定します。

GETはウェブサーバに情報を要求することを意味します。

この時点では、まだウェブサーバとの通信は行われていません。

request.send

WinHttpRequestのsendメソッドを呼び出すことで初めてウェブサーバに対して通信が行われます。

  Debug.Print request.responseText

WinHttpRequestのresponseTextは、ウェブサーバから返ってきた結果を文字列で表します。 今回はHTMLが返ってきました。

とりあえずやってみたが・・・

動くものをということでWinHTTPのスクレイピングサンプルを書いてみました。

シンプルに実装してみましたが、HTTPの考え方を知らないとピンとこないかも知れません。

次回は、WinHTTPの具体的な使い方に入る前にHTTPついて少し踏み込んでみたいと思います。

ここまでお読みいただき、ありがとうございました。

www.tekizai.net