この記事では
- VBAを使ったスクレイピングの一つの手法であるWinHTTPを使ったスクレイピングの例を紹介しています。
- VBAによるWinHTTPを使ったスクレイピングについて知りたい人に向けて書いています。
VBAでWinHTTPを使う
この記事ではWinHTTPを使った簡単なスクレイピングのコードを紹介します。
難しい理屈は抜きにして、とりあえず動くものを作って、実際のWinHTTPの例を見てみることにしましょう。
VBAでWinHTTPを使う準備をする
VBEの参照設定から、Microsoft Win HTTP Services ○○を探します。
こうすることで、コーディングの際にインテリセンスが働くので楽をすることができます。
試しに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
上述のコードを実行すると
イミディエイトウィンドウが意味不明な文字列で溢れかえってしまいましたが(黒地に緑字ですが、イミディエイトウィンドウです!デフォルト設定を変えています。) ちゃんとスクレイピングできているようです。
これは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の考え方を紹介しています。
↓記事ではもっと実践的なWinHTTPのコードを紹介しています。
というわけで、ここまでお読みいただき、ありがとうございました。