プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Excel VBA+IEでのスクレイピング

 書くと宣言しながら、すっぽかしていたクローラー/スクレイピング Advent Calendar 2014の11日目です。ExcelのVBAで、IEの操作が出来ます。またその中の機能にDOM操作があります。この二つがあれば、Excelだけでスクレイピングできますよという話です。
 何を隠そう、私が初めてスクレイピングに手を染めたのはこのExcel VBAスクレイピングでした。毎月定期的に所定のデータを観測するという仕事があって、面倒くさくて仕方がない私は記録用のExcelを魔改造して勝手に取得するようにしました。1時間くらい掛かってた作業も、ボタンポチになったので随分楽になったと記憶しています。(結局、ボタンを押すのも面倒くさくなって、毎日サーバサイドで動かすようにしましたが)
 スクレイピングの手始めにピッタリのExcel VBAスクレイピングです。環境の用意が簡単なので、ノンプログラマーでも何とかなるのではとおもいます。

Excel VBA+IEスクレイピングでの主要な機能



 Excel VBAでスクレイピングする場合は、下記のクラス・メソッドを利用します。一部バージョンによってサポートしていないので、ご注意ください。

  1. InternetExplorerクラス

 名前の通りInternetExplorerを操作するクラス。Excelから実行で、IEがポコっと立ち上がる

  1. HTMLElementCollection

 InternetExplorerクラスのドキュメントを扱うプロパティ?

  1. getElementsByTagName

 タグ名からエレメント・コレクションを取得するメソッド

  1. getElementsByClassName

 クラス名からエレメント・コレクションを取得するメソッド
 (XP等では、未サポート?)

  1. getElementById

 ID名からエレメントを取得するメソッド
 (XP等では、未サポート?)

Excel VBA+IEスクレイピングの下準備とサンプルソース



次のライブラリを参照設定します。参照設定、懐かしいなぁ。

  • Microsoft HTML Object library
  • Microsoft Internet Controls

f:id:dkfj:20141227172806p:plain

サンプルソース
手抜きですが、タグ名で取得しています。

Option Explicit
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private objIE As InternetExplorer

Sub main()
    Set objIE = New InternetExplorer
    Dim url
    url = "http://www.hatena.ne.jp"
    objIE.Visible = True
    objIE.Navigate2 (url)
    
    '読み込み完了待ち
    While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True
        DoEvents
        Sleep 100
    Wend
    Sleep 100
    
    Dim objDoc As HTMLElementCollection
    Set objDoc = objIE.document
    Dim element As IHTMLElement
    For Each element In objDoc.getElementsByTagName("a")
            MsgBox (element.innerText)
    Next element
    
    objIE.Quit
    Set objIE = Nothing
End Sub

 Excel VBAなので、取得結果をExcelのシートに格納するなどに、絶大な威力を発揮します。Excel VBAなどで検索すると色々でてくるので、ぜひ見てください。

まとめ



 自分としては、もはやExcel VBAでスクレイピングすることはないと思います。しかし、プログラムの実行環境がないよという場合には、Excel VBAという選択肢も良いのではないでしょうか?世の中には、VBAを極めている人は多数いるので、身近な人に聞けるというメリットもあります。ノンプログラマでも、ちょっと頑張れば何とかなると思うので、挑戦してみてはいかがでしょうか?
 また、スクレイピングやクローラーの作成手順を一から知りたい人は、Rubyだけどこの本読むとよいですよ。

See Also:
「データを集める技術」という本を執筆しました
非エンジニアでも何とか出来るクローラー/Webスクレイピング術
プログラミング・レスで5分でサックリWebスクレイピング「kimonolabs」
『Rubyによるクローラー開発技法』を書きました

参照:
クローラー/スクレイピング Advent Calendar 2014
IE自動操作コード一覧(ExcelVBA / VBScript) - Qiita

データを集める技術 最速で作るスクレイピング&クローラー (Informatics&IDEA)

データを集める技術 最速で作るスクレイピング&クローラー (Informatics&IDEA)

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例