適材適所

PowerShellを中心にプログラミングやシステム管理の備忘録的なブログ

WinHTTPとVBAでスクレイピングする

この記事では

  • VBAを使ったスクレイピングの一つの手法であるWinHTTPを使ったスクレイピングの例を紹介しています。
  • VBAによるWinHTTPを使ったスクレイピングについて知りたい人に向けて書いています。

VBAで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の取得もしていますが、それだけではなく、cookieの処理やjavascriptの実行、cssによる装飾、そして画面に表示するためのレンダリングなど沢山の処理を実行してくれています。

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の考え方を知らないとピンとこないかも知れません。

下記の記事では、もっと踏み込んだ内容について書いていますのでご覧頂けると幸いです。

↓記事ではHTTPの考え方を紹介しています。

www.tekizai.net

↓記事ではもっと実践的なWinHTTPのコードを紹介しています。

www.tekizai.net

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